查询可选参数

时间:2016-06-07 01:44:38

标签: python postgresql psycopg2

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

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

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

1 个答案:

答案 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传递,则不会被过滤。