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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:27:07