【问题标题】:pg8000 Can't Parameterize Queriespg8000 无法参数化查询
【发布时间】:2019-03-02 15:29:21
【问题描述】:

我一直在尝试使用 pg8000 与我的 SQL 服务器进行交互,但由于某种原因,它无法正确接受参数。它似乎确实可以识别参数样式,然后知道将其更改为 PostgreSQL 参数,但它似乎从未传递过参数。我在这里查看了(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',))

这些查询失败,但我得到的错误是错误位于$1,pg8000 将%s 转换为。

我做错了什么?

【问题讨论】:

  • 我的猜测是,应该传递用于限制右侧的查询参数,例如 IN (%s, %s)= %s 等,而不是表或列名称等架构项
  • 试过了,得到了一个不同的错误。查询是 SELECT * FROM schema.table_name WHERE column IN (%s); 并得到错误 ProgrammingError: (u'ERROR', u'ERROR', u'25P02', u'current transaction is aborted, commands ignored until end of transaction block', u'postgres.c', u'1309', u'exec_parse_message')
  • 试试SELECT * FROM schema.table_name WHERE column = '%s';
  • 同样的错误,但也没有帮助。

标签: python postgresql pg8000


【解决方案1】:

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

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

【讨论】:

  • 不起作用。如果我在不更改 paramstyle 的情况下执行此操作,则会从 pg8000 收到错误消息,指出此样式不正确。如果我将 paramstyle 更改为 pyformat,我会得到与最初相同的错误。
【解决方案2】:

对于 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}")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2017-08-31
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多