如何创建支持零个、一个或多个占位符的多查询通用函数?
问题:设计支持零个或多个占位符的通用数据库查询函数
需要创建一个通用数据库查询函数,适配不同表的查询需求,支持传入零个、单个或多个占位符。现有函数仅能处理单个占位符,代码如下:
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
相关产品推荐
相关产品推荐

