[PYTHON] À propos des transactions lors de l'utilisation de PostgreSQL avec Psycopg2

Voici un résumé de l'utilisation de base de Psycopg2 et des nouvelles leçons apprises sur les transactions.

environnement

Psycopg2 : 2.8.4 Heroku : 0.1.4 python : 3.7.4

Connectez-vous à DB avec Psycopg2 et exécutez l'instruction SQL

Tout sur psycopg2 est écrit dans la documentation officielle. https://www.psycopg.org/docs/usage.html#transactions-control

Ce qui suit est celui qui n'a besoin que de savoir au moins cela. C'est facile!

psycopg2.py


#Commencez par créer une instance de connexion connectée au DB avec la fonction de connexion.
conn = psycopg2.connect(DATABASE_URL)

#Ensuite, dans la méthode curseur de l'instance de connexion, créez une instance de curseur qui peut exécuter l'instruction sql.
cursor = conn.cursor()

#Lorsque vous faites INSERT ou DELETE, exécutez-le, puis validez et reflétez-le dans la base de données.
cursor.execute("L'instruction SQL que vous souhaitez exécuter")
cursor.commit()

#Après SELECT, exécutez, puis récupérez-en un, récupérez tout ou récupérez plusieurs
cursor.execute("L'instruction SQL que vous souhaitez exécuter")
data = cursor.fetchall()
cursor.close() #N'oubliez pas de fermer ça

#Enfin déconnecter
conn.close()

Faites attention

Assurez-vous de "fermer" ou "valider" le curseur après avoir exécuté l'instruction sql. Même si vous «validez», «curseur» sera automatiquement «fermé».

Autrement dit, toujours conn.commit () après l'exécution de INSERT, et cursor.close () après fetch après SELECT.

Selon la documentation, une transaction est créée lorsque l'instruction sql est exécutée. Ceci est géré par la classe de connexion. La transaction se termine lorsque le "curseur" est "fermé".

Si une autre instruction sql est exécutée avant la transaction déjà exécutée closes, l'instruction sql sera exécutée dans la même transaction (aucune nouvelle transaction ne sera créée).

En d'autres termes, si vous ne terminez pas correctement la transaction (ne fermez pas le curseur), l'instruction sql continuera à être exécutée pour toujours dans la même transaction. La chose effrayante à ce sujet est qu'une fois qu'une erreur se produit dans une transaction, elle sera piégée dans l'erreur pour toujours jusqu'à la fin de la transaction, rendant la prochaine instruction SQL non exécutable.

Donc, chaque fois que vous exécutez une instruction sql, laissez curseur`` se fermer.

Avec déclaration pour vous qui risquez d'oublier fermer

L'utilisation de l'instruction with ressemble à ceci. Un excellent qui même commets sans permission lorsque le traitement dans la phrase with est terminé. Au fait, il ne semble y avoir aucun problème même si vous «validez» après avoir exécuté SELECT. En d'autres termes, c'est un "commit`".

connect.py


import psycopg2

DATABASE_URL = os.environ.get('DATABASE_URL')
SQL = "select *à partir du nom de la table"

with psycopg2.connect(DABASE_URL) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL)
        result = curs.fetchall()
#Les résultats de la recherche sont stockés dans une liste dans result


Soit dit en passant, notez que même si «curseur» est «fermé» avec, «connection» semble rester connecté. (Qu'est-ce qui ne va pas à le garder connecté ...)

Pour ceux qui ne souhaitent pas utiliser le mode de validation automatique avec instruction

La méthode set_session de l'instance de connexion peut contrôler l'exécution de l'instruction sql suivante. Si vous définissez le «mode autocommit», il s'engagera sans autorisation après l'exécution. Je vous remercie. Lorsqu'il est réglé sur «mode lecture», INSERT et DELETE ne peuvent pas être exécutés.

Pour plus d'informations, voir Documents officiels

connect.py


import psycopg2

DATABASE_URL = os.environ.get('DATABASE_URL')
SQL = "select *à partir du nom de la table"

#Comme d'habitude jusqu'à ce que vous créiez une occurrence de curseur
conn = psycopg2.connect(DATABASE_URL)
cursor = conn.cursor()

#Peut être défini pour l'exécution suivante
conn.set_session(readonly=True, autocommit=True)

#Même si vous l'exécutez normalement, il sera commis sans autorisation après cela ~~
self.cursor.execute (sql)

Cela reste également connecté à moins que conn.close ().

Recommended Posts

À propos des transactions lors de l'utilisation de PostgreSQL avec Psycopg2
Utiliser PostgreSQL avec Lambda (Python + psycopg2)
Précautions lors du calcul avec une chaîne pour TmeStampType de PySpark
Lorsque la mousse avec pip installer
Utile lors du débogage avec TouchDesigner
Connectez-vous à Postgresql avec GO
Insérer à partir de pd.DataFrame avec psycopg2
Erreur lors de la lecture avec python