You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Psycopg2拼接PostgreSQL查询字符串触发事务错误,求协助

问题解决:Psycopg2事务中止+查询参数误用

这个错误的核心是当前事务已经因为之前的错误中止,必须先回滚才能继续执行新的SQL命令。另外你的查询还存在参数类型误用的问题,一起给你修正:

步骤1:先回滚中止的事务

在执行新查询前,先调用连接对象的rollback()方法,清空失败的事务状态:

conn.rollback()  # conn是你的psycopg2连接对象

步骤2:修正查询的参数处理

你错误地用sql.Identifier来处理table_name和table_schema的条件值——sql.Identifier是用来处理数据库对象名(比如表、列、schema的名称本身)的,会给值加上双引号变成标识符格式;但information_schema.tables里的table_name和table_schema是字符串类型的字段,应该用字符串字面量来匹配,下面提供两种修正方案:

方案一:用sql.Literal(贴合你原有的写法)

from psycopg2 import sql

tablename = "mytab"
schema = "public"
# 用sql.Literal处理字符串值,生成正确的字符串字面量
query = sql.SQL("SELECT table_name from information_schema.tables where table_name = {tablename} and table_schema = {schema};")
query = query.format(tablename=sql.Literal(tablename), schema=sql.Literal(schema))

# 先回滚事务
conn.rollback()
cursor.execute(query)
result = cursor.fetchone()[0]

方案二:用占位符(更推荐,Psycopg2标准参数绑定方式)

这种方式更简洁,还能自动处理类型转换:

tablename = "mytab"
schema = "public"
# 用%s作为占位符,参数放在execute的第二个参数中
query = "SELECT table_name from information_schema.tables where table_name = %s and table_schema = %s;"

conn.rollback()
cursor.execute(query, (tablename, schema))
result = cursor.fetchone()[0]

错误根源说明

当你用sql.Identifier("mytab")时,生成的SQL是table_name = "mytab"——这里的"mytab"是PostgreSQL的标识符(比如表名),而不是字符串值。但information_schema.tables.table_name存储的是字符串(比如'mytab'),两者无法匹配,导致查询失败,进而触发事务中止,最终出现你看到的报错。

内容的提问来源于stack exchange,提问作者marie20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:54:23