You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建支持零个、一个或多个占位符的多查询通用函数?

问题:设计支持零个或多个占位符的通用数据库查询函数

需要创建一个通用数据库查询函数,适配不同表的查询需求,支持传入零个、单个或多个占位符。现有函数仅能处理单个占位符,代码如下:

def function_q(query, placeholder):
    cursor.execute(query, (placeholder,))
    return cursor.fetchall()

单个占位符调用正常:

person_id = 100
result = function_q('SELECT name FROM persons WHERE n_id = ?;', person_id)

但无法适配零占位符或多占位符场景,比如多占位符的调用需求:

person_id = 100
age = 30
result = function_q('SELECT name FROM persons WHERE n_id = ? and age = ?;', person_id, age)

解决方案

方案1:使用可变位置参数*args

直接通过*args接收任意数量的占位符参数,args本身就是元组,可以直接传递给cursor.execute:

def function_q(query, *args):
    cursor.execute(query, args)
    return cursor.fetchall()

调用示例:

  • 零占位符:
result = function_q('SELECT * FROM persons;')
  • 单个占位符:
person_id = 100
result = function_q('SELECT name FROM persons WHERE n_id = ?;', person_id)
  • 多个占位符:
person_id = 100
age = 30
result = function_q('SELECT name FROM persons WHERE n_id = ? and age = ?;', person_id, age)

方案2:兼容单个值与序列类型的参数

如果需要支持直接传入列表/元组作为占位符集合,同时兼容单个参数的场景,可以这样设计:

def function_q(query, placeholders=None):
    # 处理零占位符的情况
    if placeholders is None:
        placeholders = ()
    # 若传入单个非序列值,自动转为元组
    elif not isinstance(placeholders, (list, tuple)):
        placeholders = (placeholders,)
    cursor.execute(query, placeholders)
    return cursor.fetchall()

调用示例:

  • 零占位符:
result = function_q('SELECT * FROM persons;')
  • 单个占位符(两种方式均可):
# 直接传单个值
result = function_q('SELECT name FROM persons WHERE n_id = ?;', 100)
# 传入列表/元组
result = function_q('SELECT name FROM persons WHERE n_id = ?;', [100])
  • 多个占位符:
result = function_q('SELECT name FROM persons WHERE n_id = ? and age = ?;', (100, 30))

方案对比

  • 方案1调用更简洁直观,适合明确知道占位符数量的场景;
  • 方案2灵活性更高,适合占位符参数已经是列表/元组的场景,或者需要动态生成占位符集合的情况。

内容的提问来源于stack exchange,提问作者Erika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:01:27