【问题标题】:psycopg2.errors.ActiveSqlTransaction: CREATE TABLESPACE cannot run inside a transaction blockpsycopg2.errors.ActiveSqlTransaction:CREATE TABLESPACE 不能在事务块内运行
【发布时间】:2021-06-22 13:03:59
【问题描述】:

我对 Python 很陌生,我们有一个应用程序容器和一个数据库容器。应用容器从 CLI 收集 DB_HOST、PORT 等值并尝试在同一 docker 主机上运行的容器化 Postgres DB 上创建表空间。

在执行查询时,我们遇到了错误。

psycopg2.errors.ActiveSqlTransaction: CREATE TABLESPACE cannot run inside a transaction block

使用的 Python 库:

  • psycopg2
  • psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT

App Dockefile 示例


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"]                

相同的 python 代码一直运行到 2021 年 6 月 16 日。psycopg2 和 psycopg2.extensions 是否有任何最近的变化?

尝试了以下方法,但没有成功。

  1. 将 python:3.7-alpine 更新为 python:alpine3.12
  2. Postgres 容器已更新至 Postgres13

【问题讨论】:

标签: python psycopg2 postgres-12


【解决方案1】:

psycopg2-binary 刚刚发布了新版本 2.9.1,这可能是由于它。 https://pypi.org/project/psycopg2/#history

尝试使用旧版本 2.8.6 来检查它是否像以前一样工作。

【讨论】:

    【解决方案2】:

    @Learner 是对的。

    版本 2.9.x always starts a transaction when you connect to a database using a context manager 像这样:

    with psycopg2.connect(...) as connection:
        # This starts a transaction as of v2.9
        ...
    

    以下是发行说明中的​​引述:

    with connection 也在自动提交事务上启动事务(票证#941)。

    这意味着以这种方式连接时,无法再发出CREATE DATABASEDROP DATABASE 之类的命令。

    虽然文档似乎没有提供这个问题的官方解决方案,it has been suggested 表示“新”方法是使用“旧”方法连接到数据库:

    try:
        connection = psycopg2.connect(...)
        with connection.cursor() as cursor:
            cursor.execute("CREATE DATABASE foo")
    finally:
        if connection:
            connection.close()
    

    【讨论】:

    • 如果psycop2.connect 提高,示例有可能提高NameError: name 'connection' is not defined。需要将connect 移出try
    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2021-05-31
    • 2019-04-08
    • 2020-12-03
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多