Lea*_*ner 9 python psycopg2 postgres-12
我对 Python 很陌生,我们有一个应用程序容器和一个数据库容器。应用程序容器从 CLI 收集 DB_HOST、PORT 等值,并尝试在同一 Docker 主机上运行的容器化 Postgres DB 上创建表空间。
在执行查询时,我们收到以下错误。
psycopg2.errors.ActiveSqlTransaction: CREATE TABLESPACE cannot run inside a transaction block
Run Code Online (Sandbox Code Playgroud)
使用的Python库:
psycopg2psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT应用程序文档示例
FROM python:3.7-alpine
RUN apk update && \
apk add --no-cache openssh sshpass && \
apk add --no-cache --virtual .build-deps gcc musl-dev && \
apk add linux-headers && \
apk add python3-dev && \
apk add postgresql-dev && \
apk add postgresql-client && \
apk add bash && \
apk add libffi-dev make
RUN pip install --upgrade pip
RUN pip install PyYAML==5.3.1 \
docker==4.2.1 \
cryptography==2.8.0 \
docker-pycreds==0.4.0 \
docker-compose==1.26.0 \
dockerpty==0.4.1 \
netaddr==0.7.19 \
netifaces==0.10.9 \
pycryptodome \
psycopg2-binary \
mock
ARG AP_DIR=/var/abc/sm
RUN mkdir -p $AP_DIR/log
ADD src/main/python $AP_DIR/python
ADD src/main/resources_hardcopy $AP_DIR/resources
ADD src/main/resources/certs $AP_DIR/resources/certs
ADD build.properties $AP_DIR
VOLUME /opt/abc/sm
VOLUME /opt/abc/apconn
RUN addgroup --system cloud && \
adduser --system --disabled-password --ingroup cloud stackhelp
USER stackhelp
WORKDIR $AP_DIR/python
CMD ["../launch.sh"]
Run Code Online (Sandbox Code Playgroud)
相同的 python 代码一直有效到 2021 年 6 月 16 日。 psycopg2 、 psycopg2.extensions 最近是否有任何更改可能导致此问题?
以下事情尝试过,但没有成功。
@Learner是对的。
当您使用上下文管理器连接到数据库时,版本 2.9.x始终启动事务,如下所示:
with psycopg2.connect(...) as connection:
# This starts a transaction as of v2.9
...
Run Code Online (Sandbox Code Playgroud)
以下是发行说明中的引用:
with connection也在自动提交事务上启动事务(票号#941)。
这意味着以这种方式连接时不能再发出诸如CREATE DATABASE或 之类的命令。DROP DATABASE
尽管文档似乎没有提供此问题的官方解决方案,但有人建议“新”方法是使用连接数据库的“旧”方法:
try:
connection = psycopg2.connect(...)
with connection.cursor() as cursor:
cursor.execute("CREATE DATABASE foo")
finally:
if connection:
connection.close()
Run Code Online (Sandbox Code Playgroud)
psycopg2-binary 刚刚发布了新版本 2.9.1,这可能是由于它。https://pypi.org/project/psycopg2/#history
尝试使用旧版本 2.8.6 检查它是否像以前一样工作。