【问题标题】:Python & Psycopg2 | Dynamic Query with varying WHERE clausesPython & Psycopg2 |具有不同 WHERE 子句的动态查询
【发布时间】:2019-10-18 01:45:29
【问题描述】:

我正在尝试创建一个函数,该函数根据传递给它的参数执行查询。

def sql_query(filter1, filter2, filter3):
    with ConnectionPool() as cursor:
        cursor.execute('''SELECT * FROM table 
        WHERE filter1 = %s AND filter2 =%s AND filter3 = %s;'''
        cursor.fetchall()

但只要其中一个过滤器为无,我就不希望该参数成为 SQL 查询的一部分。

例如,如果只使用过滤器 1,那么我希望查询变为:

def sql_query(filter1, filter2, filter3):
    with ConnectionPool() as cursor:
        cursor.execute('''SELECT * FROM table 
        WHERE filter1 = %s;'''
        cursor.fetchall()

如何实现动态生成查询?

【问题讨论】:

    标签: python sql python-3.x postgresql psycopg2


    【解决方案1】:

    COALESCE 视为Python 的None 转换为SQL 的NULL。下面的方法现在使用默认为 None 的可选参数:

    def sql_query(filter1=None, filter2=None, filter3=None):
        with ConnectionPool() as cursor:
            sql = '''SELECT * FROM table 
                     WHERE filter1 = COALESCE(%s, filter1) 
                       AND filter2 = COALESCE(%s, filter2) 
                       AND filter3 = COALESCE(%s, filter3);
                  '''
            cursor.execute(sql, (filter1, filter2, filter3))
            cursor.fetchall()
    

    【讨论】:

    • 这真是太聪明了。而不是那种你最终会后悔的聪明人......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多