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.
@ 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()