Hier finden Sie eine Zusammenfassung der grundlegenden Verwendung von Psycopg2 und neue Erkenntnisse zu Transaktionen.
Psycopg2 : 2.8.4 Heroku : 0.1.4 python : 3.7.4
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()
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.
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 ...)
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