python 如何省略SQL查询的某些部分

h5qlskok  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(110)
  • 免责声明,我非常清楚有一个更好的方式来表达这个问题,如果有人想建议一个更好的方式,我很乐意改变它 *

过去4年我一直在使用DynamoDB,现在我正在将我的一个表切换到PostgreSQL。我一直在使用psycopg2 python库来测试一些查询。用户将需要对数据库进行过滤,所以有一个全在一个过滤器查询会很好。
我希望用户能够为给定的过滤器选择多个值,或者不选择任何值,如果选择“无”,则该字段不应被过滤。下面是一个基本的查询可能的样子(这只是一个可以完成提出我的问题的示例)。

conn = psycopg2.connect(host=ENDPOINT, port=PORT, database=DBNAME, user=USER, password=PASSWORD, sslrootcert="SSLCERTIFICATE")
cur = conn.cursor()
sql = """
    SELECT * FROM table_name 
    WHERE column_1 in %s AND column_2 in %s
    ORDER BY datetime DESC
"""
sql_values = (("XXXXYXY", "XXXYYXXY"), ("ZGZGZGZGGG","GZGGGGZGG"))
cur.execute(sql, sql_values)

下面是column_2没有值的查询类型:

conn = psycopg2.connect(host=ENDPOINT, port=PORT, database=DBNAME, user=USER, password=PASSWORD, sslrootcert="SSLCERTIFICATE")
cur = conn.cursor()
sql = """
    SELECT * FROM table_name 
    WHERE column_1 in %s AND column_2 in %s
    ORDER BY datetime DESC
"""
sql_values = (("XXXXYXY", "XXXYYXXY"), ())
cur.execute(sql, sql_values)

显然,这是行不通的。简而言之,我希望它只查询那些有数据的列。实现这一点最有效的方法是什么?

gcuhipw9

gcuhipw91#

下面演示如何动态生成查询:

conn = psycopg2.connect(host=ENDPOINT, port=PORT, database=DBNAME, user=USER, password=PASSWORD, sslrootcert="SSLCERTIFICATE")
cur = conn.cursor()

where = []
data = []

for q,r in (
    ("column_1", ("XXXXYXY","XXXYYXXY")),
    ("column_2", ("XXXZZXY","XXZZYXXY")),
    ("column_3", ())
    ):
    if r:
        where.append( "%s in %%s" % q )
        data.append(r)

sql = "SELECT * FROM table_name WHERE "
sql += " AND ".join(where)
sql += " ORDER BY datetime DESC;";
print(sql)
cur.execute(sql, data)

输出:

SELECT * FROM table_name WHERE column_1 in %s AND column_2 in %s ORDER BY datetime DESC;

相关问题