pg8000无法参数化查询

时间:2018-09-26 19:19:44

标签: python postgresql pg8000

我一直试图使用pg8000与我的SQL Server进行交互,但是由于某些原因,它不能正确接受参数。它似乎确实认识到paramstyle,然后知道将其更改为PostgreSQL params,但似乎从未传递过param。我在(link)处查看了文档示例,但它们没有用。以下是一些示例:

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将$1转换为%s

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

尝试显式命名参数并作为dict传递:

param_dict = dict(table_name = 'schema.table_name')
query = """SELECT * FROM %(table_name)s"""
# cursor setup code...
cursor.execute(query, param_dict)

答案 1 :(得分:0)

使用 PostgreSQL,SQL 语句的某些部分 can't be parameterized。在您的示例中:

cursor.execute("SELECT * FROM %s", 'schema.table_name')

表名不能被参数化,所以你必须自己创建字符串:

table_name = 'schema.table_name'
cursor.execute(f"SELECT * FROM {table_name}")