[PYTHON] Informationen zu Transaktionen beim Betrieb von PostgreSQL mit Psycopg2

Hier finden Sie eine Zusammenfassung der grundlegenden Verwendung von Psycopg2 und neue Erkenntnisse zu Transaktionen.

Umgebung

Psycopg2 : 2.8.4 Heroku : 0.1.4 python : 3.7.4

Stellen Sie mit Psycopg2 eine Verbindung zur Datenbank her und führen Sie die SQL-Anweisung aus

Alles über psycopg2 ist in der offiziellen Dokumentation geschrieben. https://www.psycopg.org/docs/usage.html#transactions-control

Das Folgende ist derjenige, der nur mindestens dies wissen muss. Es ist einfach!

psycopg2.py


#Erstellen Sie zunächst eine mit der Datenbank verbundene Verbindungsinstanz mit der Verbindungsfunktion.
conn = psycopg2.connect(DATABASE_URL)

#Erstellen Sie dann in der Cursormethode der Verbindungsinstanz eine Cursorinstanz, die die SQL-Anweisung ausführen kann.
cursor = conn.cursor()

#Wenn Sie INSERT oder DELETE ausführen, führen Sie es aus, schreiben Sie es fest und spiegeln Sie es in der Datenbank wider.
cursor.execute("Die SQL-Anweisung, die Sie ausführen möchten")
cursor.commit()

#Nach SELECT ausführen und dann mit Fetch One abrufen, alle abrufen oder viele abrufen
cursor.execute("Die SQL-Anweisung, die Sie ausführen möchten")
data = cursor.fetchall()
cursor.close() #Vergiss nicht, dies zu schließen

#Zum Schluss trennen
conn.close()

Achtung

Stellen Sie sicher, dass Sie den Cursor nach dem Ausführen der SQL-Anweisung schließen oder festschreiben. Selbst wenn Sie "festschreiben", wird "Cursor" automatisch "geschlossen".

Das heißt, immer conn.commit () nach dem Ausführen von INSERT undcursor.close ()nach fetch nach SELECT.

Gemäß der Dokumentation wird eine Transaktion erstellt, wenn die SQL-Anweisung ausgeführt wird. Dies wird von der "Verbindungsklasse" erledigt. Die Transaktion endet, wenn der Cursor geschlossen ist.

Wenn eine andere SQL-Anweisung vor der bereits ausgeführten Transaktion "close" ausgeführt wird, wird die SQL-Anweisung in derselben Transaktion ausgeführt (es wird keine neue Transaktion erstellt).

Mit anderen Worten, wenn Sie die Transaktion nicht ordnungsgemäß beenden (Cursor nicht schließen), wird die SQL-Anweisung für immer in derselben Transaktion ausgeführt. Das Beängstigende ist, dass ein Fehler, der in einer Transaktion auftritt, für immer im Fehler eingeschlossen bleibt, bis die Transaktion endet, wodurch die nächste SQL-Anweisung nicht mehr ausgeführt werden kann.

Lassen Sie also jedes Mal, wenn Sie eine SQL-Anweisung ausführen, den Cursor schließen.

Mit Aussage für Sie, die wahrscheinlich nah vergessen werden

Die Verwendung der with-Anweisung sieht folgendermaßen aus. Eine ausgezeichnete, die sogar ohne Erlaubnis "festschreibt", wenn die Verarbeitung im with-Satz abgeschlossen ist. Übrigens scheint es kein Problem zu geben, selbst wenn Sie nach dem Ausführen von SELECT "festschreiben". Mit anderen Worten, es ist ein "Commit".

connect.py


import psycopg2

DATABASE_URL = os.environ.get('DATABASE_URL')
SQL = "select *vom Tabellennamen"

with psycopg2.connect(DABASE_URL) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL)
        result = curs.fetchall()
#Suchergebnisse werden in einer Ergebnisliste gespeichert


Übrigens, auch wenn "Cursor" mit "nah" ist, scheint "Verbindung" verbunden zu bleiben. (Was ist falsch daran, es in Verbindung zu halten ...)

Für diejenigen, die den Autocommit-Modus mit Anweisung nicht verwenden möchten

Die set_session-Methode der Verbindungsinstanz kann die Ausführung der nächsten SQL-Anweisung steuern. Wenn Sie es auf "Autocommit-Modus" setzen, wird es nach der Ausführung ohne Erlaubnis festgeschrieben. Vielen Dank. Bei Einstellung auf "Readonry-Modus" können INSERT und DELETE nicht ausgeführt werden.

Weitere Informationen finden Sie unter Offizielle Dokumente.

connect.py


import psycopg2

DATABASE_URL = os.environ.get('DATABASE_URL')
SQL = "select *vom Tabellennamen"

#Wie gewohnt, bis Sie eine Cursorinstanz erstellen
conn = psycopg2.connect(DATABASE_URL)
cursor = conn.cursor()

#Kann für die folgende Ausführung eingestellt werden
conn.set_session(readonly=True, autocommit=True)

#Selbst wenn Sie es normal ausführen, wird es danach ohne Erlaubnis festgeschrieben ~~
self.cursor.execute (sql)

Dies bleibt auch verbunden, es sei denn, "conn.close ()".

Recommended Posts

Informationen zu Transaktionen beim Betrieb von PostgreSQL mit Psycopg2
Verwenden Sie PostgreSQL mit Lambda (Python + psycopg2)
Vorsichtsmaßnahmen bei der Berechnung mit Zeichenfolge für TmeStampType von PySpark
Wenn Moos mit Pip installieren
Nützlich beim Debuggen mit TouchDesigner
Stellen Sie mit GO eine Verbindung zu Postgresql her
Mit psycopg2 aus pd.DataFrame einfügen
Fehler beim Spielen mit Python