psycopg2执行CREATE TABLESPACE报ActiveSqlTransaction错误求助
问题原因
你遇到的报错确实和psycopg2的版本行为调整相关,2021年中前后psycopg2 2.9版本正式发布,对事务自动提交的处理逻辑做了变更:
- 旧版本(2.8及更早)中,连接创建后未执行任何语句时,调用
set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)可以正常生效,不会自动开启隐式事务 - 2.9及之后版本中,连接创建后会默认开启隐式事务,若你在创建连接之后再修改隔离级别,设置完成前已经存在活跃事务,执行
CREATE TABLESPACE这类不允许在事务块中运行的语句就会触发报错
你的Dockerfile中没有锁定psycopg2-binary的版本,每次构建镜像都会拉取最新版,刚好在2021年6月16日前后拉到了更新后的版本,就出现了之前正常、突然报错的情况,这和你尝试调整的基础镜像、Postgres版本没有关联。
解决方案
1. 锁定依赖版本验证问题
首先修改Dockerfile中的pip安装语句,锁定psycopg2-binary为2021年6月前的稳定版,重新构建测试是否恢复正常:
psycopg2-binary==2.8.6
2. 调整自动提交设置逻辑(兼容所有版本)
不要在连接创建完成后再修改隔离级别,改为创建连接时直接开启自动提交,两种写法可选:
写法一:直接设置autocommit属性
import psycopg2 conn = psycopg2.connect( host=DB_HOST, port=PORT, user=你的数据库用户, password=你的数据库密码, dbname=你的数据库名 ) conn.autocommit = True
写法二:连接参数指定autocommit
conn = psycopg2.connect( host=DB_HOST, port=PORT, user=你的数据库用户, password=你的数据库密码, dbname=你的数据库名, options="-c autocommit=on" )
3. 执行DDL前清理活跃事务
如果你的代码中在创建表空间之前有执行过其他查询,执行前先提交/回滚已有的事务:
# 执行CREATE TABLESPACE前先提交已有事务 conn.commit() cursor.execute("CREATE TABLESPACE 你的表空间名 LOCATION 你的存储路径;")
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

