假设我有一个包含年龄和名称列的用户表。我想编写一个函数来查询这个表,要么选择所有内容,要么根据年龄进行选择。天真我可能会做
def query(age=''):
query_args = ' WHERE {}'.format(age) if age else ''
db.execute('SELECT * FROM users' + query_args)
显然这是一个可怕的想法,但我不确定处理这种情况的更好方法是 - 如果年龄作为一个论点或者它作为一个参数传递,那么写一个单独的查询似乎很难看。不是,尤其是在我可能有多个查询参数的更复杂的例子中。
答案 0 :(得分:6)
你是对的,构建查询字符串是一个可怕的想法。这个问题不是驱动程序。它只是SQL:
query = """
select *
from users
where
(%(age)s is null or %(age)s = age)
and
(%(name)s is null or %(name)s = name)
"""
parameters = dict(name = None, age = 35)
cursor.execute(query, parameters)
如果某个参数作为null传递,则不会被过滤。