使用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
相关产品推荐
相关产品推荐

