web-dev-qa-db-fra.com

psycopg2.errors.activeqlTransaction: Créer une épisette de table ne peut pas exécuter à l'intérieur d'un bloc de transaction

Je suis assez nouveau à Python, nous avons un conteneur d'applications et un conteneur DB. Conteneur d'applications collecte des valeurs telles que db_host, le port, etc. de CLI & Essayez de créer de la table à table sur Postgres conteneurisée DB exécutant sur le même hôte Docker.

Pendant l'exécution, la requête que nous obtenons ci-dessous une erreur.

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

Bibliothèques Python utilisées:

  • psycopg2
  • psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT

Application de Dockefile d'applications


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

le même python code travaille jusqu'au 16 juin 2021. Existe-t-il des modifications récentes dans PSYCOPG2, psycopg2.extensions peut provoquer cela?

Les choses suivantes ont essayé, mais ne fonctionnaient pas.

  1. Python mis à jour: 3.7-Alpine à Python: Alpine3.12
  2. Conteneur Postgres mis à jour sur Postgres13
6
Learner

@ apprenant a raison.

Version 2.9.x démarre toujours une transaction lorsque vous vous connectez à une base de données à l'aide d'un gestionnaire de contexte comme ceci:

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

Voici une citation des notes de publication:

with connection Démarre aussi une transaction sur les transactions Autocommet (ticket # 941 ).

Cela signifie que les commandes comme CREATE DATABASE ou DROP DATABASE ne peut plus être émis lors de la connexion de cette manière.

Bien que les documents ne semblent pas offrir une solution officielle à ce problème, il a été suggéré que le "nouveau" moyen de le faire est d'utiliser l'ancienne méthode de connexion à la base de données:

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