查询可选参数

ira*_*ira 4 python postgresql psycopg2

假设我有一个带有年龄和名称列的用户表.我想写一个函数来查询这个表,要么选择所有内容,要么根据年龄进行选择.天真,我可能会这样做

def query(age=''):
    query_args = ' WHERE {}'.format(age) if age else ''
    db.execute('SELECT * FROM users' + query_args)
Run Code Online (Sandbox Code Playgroud)

显然这是一个可怕的想法,但我不确定处理这种情况的更好方法是 - 如果将年龄作为参数传递或者不是,那么编写单独的查询似乎非常难看,尤其是在更复杂的示例中我可能有多个查询参数.

Clo*_*eto 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)
Run Code Online (Sandbox Code Playgroud)

如果某个参数作为null传递,则不会对其进行过滤.