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

使用psycopg2调用pg_partman存储过程报错invalid transaction termination

问题原因与解决方案

根因分析

该报错的核心原因是psycopg2默认关闭自动提交,所有SQL执行都会默认包裹在隐式启动的事务块中:

  • 你使用的run_maintenance_proc存储过程内部,每处理完一个分区集合都会执行COMMIT操作完成事务提交
  • 存储过程内部的COMMIT会直接终止外层的隐式事务,psycopg2检测到事务状态异常就会抛出InvalidTransactionTermination错误
  • psql命令行默认开启自动提交,单条CALL语句执行时不会包裹在事务块中,因此存储过程内部的提交操作可以正常运行

修复方法

调用存储过程前主动开启连接的自动提交属性即可,修正后的代码如下:

dbconn = psycopg2.connect(t_dsn)
# 开启自动提交,避免隐式事务块冲突
dbconn.autocommit = True
cursor = dbconn.cursor()
cursor.execute('CALL partman.run_maintenance_proc()')
# 该存储过程无返回结果,无需调用fetchone()
cursor.close()
dbconn.close()

另外你提到的cursor.callproc方法确实不能用于调用存储过程,psycopg2的callproc底层是用SELECT语句实现的,仅支持调用函数,调用存储过程必须直接执行CALL语句。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:54:05