我一直在尝试使用 pg8000 与我的 SQL 服务器交互,但由于某种原因,它无法正确接受参数。它似乎确实识别了参数样式,然后知道将它们更改为PostgreSQL参数,但它似乎从未传递过参数。我查看了此处的文档示例(链接(以获取示例,但它们不起作用。以下是一些示例:
query = """
SELECT *
FROM schema.table_name
"""
conn = pg8000.connect(**credential_dict)
cursor = conn.cursor()
cursor.execute(query)
此示例有效。接下来的两个不会:
query = """
SELECT *
FROM %s
"""
conn = pg8000.connect(**credential_dict)
cursor = conn.cursor()
cursor.execute(query, 'schema.table_name')
query = """
SELECT *
FROM %s
"""
conn = pg8000.connect(**credential_dict)
cursor = conn.cursor()
cursor.execute(query, ('schema.table_name',))
这些查询失败,但我收到的错误说错误位于 pg8000 将%s
转换为的$1
。
我做错了什么?
使用 PostgreSQL,SQL 语句的某些部分无法参数化。在您的示例中:
cursor.execute("SELECT * FROM %s", 'schema.table_name')
表名无法参数化,因此您必须自己创建字符串:
table_name = 'schema.table_name'
cursor.execute(f"SELECT * FROM {table_name}")
尝试显式命名参数并作为dict
传递:
param_dict = dict(table_name = 'schema.table_name')
query = """SELECT * FROM %(table_name)s"""
# cursor setup code...
cursor.execute(query, param_dict)