Psycopg2 参数化执行查询

Psycopg2 parameterized execute query

尝试使用 Psycopg2 在我的 Postgres 查询中使用参数。 当我 google 搜索时,我看到人们使用 %s 但我想提供更具描述性的名称,就像您在下面看到的那样,以便以后我可以在 WHERE 子句中添加更多列并且它更多易于阅读。那可能吗?我做错了什么?

q = ""
q += "SELECT"
q += " id"
q += " FROM tbl_users "
q += " WHERE "
q += "("
q += " b_enabled = (%enabled)"
q += ")"
enabled = "True"
db_cursor.execute(q,enabled)

仅供参考:我意识到在这种情况下我可以将“True”作为执行方法中的第二个参数,但这是我的代码的精简版本以专注于该问题。我想知道如何在执行中放置一个变量,而不是在那个地方硬编码“True”。

错误信息:

psycopg2.errors.SyntaxError:“$”处或附近的语法错误 第 1 行:...d_visit_last 从 tbl_users WHERE ( b_enabled = ($t_enabled...

您可能希望使用多行字符串来定义您的 SQL 查询,以提供更有意义的名称,您可以使用字典将值传递给 psycopg2.execute():

import psycopg2
conn = psycopg2.connect("dbname=mf port=5959 host=localhost user=mf_usr")
cur = conn.cursor()

sql = """
    SELECT
        id
    FROM tbl_users
    WHERE
        b_enabled = %(enabled)s
"""

print (cur.mogrify(sql, {'enabled': "True"}).decode('utf-8'))
# cur.execute(sql, {'enabled': "True"})

输出:

SELECT
    id
FROM tbl_users
WHERE
    b_enabled = 'True'

请查看 official docs 了解更多信息。