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

使用psycopg2向PostgreSQL插入数据时遇InFailedSqlTransaction错误

问题解决:psycopg2插入数据时InFailedSqlTransaction错误

核心问题分析

你的代码存在两个关键错误,直接导致事务失败:

  1. SQL语句中错误地给%s包裹了单引号,psycopg2的参数化查询不需要手动添加引号——驱动会自动处理字符串转义和引号,手动添加会引发SQL语法错误,直接中断事务。
  2. 缺少事务的提交/回滚逻辑,事务失败后未及时回滚,导致PostgreSQL阻止后续所有操作。

修正步骤

1. 修正SQL语句格式

移除VALUES中%s两侧的单引号,正确的参数化SQL写法如下:

sql = "INSERT INTO <tablename> (A, B, C) VALUES (%s, %s, %s)"

2. 添加事务管理与异常处理

事务失败后必须回滚才能恢复连接可用性,正常执行完成后需要提交事务确保数据写入。完整代码示例:

import psycopg2

try:
    # 建立数据库连接
    connection = psycopg2.connect(<connection details>)
    cursor = connection.cursor()
    
    # 正确的参数化SQL语句和参数
    sql = "INSERT INTO <tablename> (A, B, C) VALUES (%s, %s, %s)"
    val = ('D', 'E', 'F')
    
    # 执行插入操作
    cursor.execute(sql, val)
    # 提交事务,确保数据写入数据库
    connection.commit()
    print("数据插入成功")

except psycopg2.Error as e:
    # 捕获到数据库错误时,回滚失败的事务
    if connection:
        connection.rollback()
    print(f"错误信息: {e}")

finally:
    # 关闭游标和连接,释放资源
    if cursor:
        cursor.close()
    if connection:
        connection.close()

错误原因详解

当原始SQL语句因语法错误执行失败时,PostgreSQL会立即终止当前事务并标记为"aborted"状态。此时任何后续数据库命令都会被拒绝,直到你执行rollback()回滚失败的事务,或者关闭连接重新建立。通过添加异常处理中的回滚逻辑,可以避免事务一直处于失败状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:58:10