postgresql
  • list
  • parameters
  • psycopg2
  • where-in
  • 2017-01-26 146 views 3 likes 
    3

    我正在使用psycopg2通过Python 3访问PostgreSQL数据库,并且我正在尝试查询我想要选择名称在列表中的所有用户的查询,如果列表不为空。如果提供的列表为空,我想忽略该条件,即选择所有用户,而不管他们的名字。如何检查值是否在列表中或列表是否为空?

    我已经尝试了以下三个调用:

    # Using list 
    cursor.execute(
        "SELECT age FROM user WHERE %(names) = '{}' OR user.name IN %(names)s", 
        {'names': []}, 
    ) 
    
    # Using tuple 
    cursor.execute(
        "SELECT age FROM user WHERE %(names) =() OR user.name IN %(names)s", 
        {'names':()}, 
    ) 
    
    # Using both list and tuple 
    cursor.execute(
        "SELECT age FROM user WHERE %(names_l) = '{}' OR user.name IN %(names_t)s", 
        {'names_l': [], 'names_t':()}, 
    ) 
    

    但他们都抛出一个无效的语法错误,从一个点或另一个:

    # Using list 
    psycopg2.ProgrammingError: syntax error at or near "'{}'" 
    LINE 17:   user.name IN '{}' 
    
    # Using tuple 
    psycopg2.ProgrammingError: syntax error at or near ")" 
    LINE 16:  () ==() 
    
    # Using both list and tuple 
    psycopg2.ProgrammingError: syntax error at or near ")" 
    LINE 17:   user.name IN() 
    

    回答

    2

    可选参数,你想要一个SQL where子句如:

    where column = :parameter or :parameter is null 
    

    与上面的那样当th e参数is null将返回所有行,否则仅返回符合条件的行。

    Psycopg将Python list改编为Postgresql array。为了检查是否有任何PostgreSQL的array值等于某一值:

    where column = any (array[value1, value2]) 
    

    要获得一个Python None,其适于一个PostgreSQL null,从空的Python list

    parameter = [] or None 
    

    传递一个dictionarycursor.execute方法避免了在参数参数参数重复:

    names = ['John','Mary'] 
    
    query = """ 
        select age 
        from user 
        where user.name = any (%(names)s) or %(names)s is null 
    """ 
    print (cursor.mogrify(query, {'names': names or None}).decode('utf8')) 
    #cursor.execute(query, {'names': names or None}) 
    

    输出:

    select age 
    from user 
    where user.name = any (ARRAY['John', 'Mary']) or ARRAY['John', 'Mary'] is null 
    

    当列表为空:

    select age 
    from user 
    where user.name = any (NULL) or NULL is null 
    

    http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries

    +0

    我觉得真的很傻,现在,没有意识到我可以使用SQL的'NULL'尽管我也知道它的存在和所有......但是,这工作得很好,谢谢你的帮助! :) –

    相关问题