Warum Verbindung in Python DB-API nicht hat „begin“ Operation?
-
23-09-2019 - |
Frage
Arbeiten mit Cursor in mysql-Python habe ich zu nennen "BEGIN;", "COMMIT;" und "Rollback"; explizit wie folgt:
try:
cursor.execute("BEGIN;")
# some statements
cursor.execute("COMMIT;")
except:
cursor.execute("ROLLBACK;")
dann fand ich heraus, dass das zugrunde liegende Verbindungsobjekt die entsprechenden Methoden hat:
try:
cursor.connection.begin()
# some statements
cursor.connection.commit()
except:
cursor.connection.rollback()
Inspizieren des DB-API PEP fand ich heraus, dass es nicht der Fall ist erwähnt die Methode begin () für das Verbindungsobjekt, auch für die Erweiterungen.
Mysql-Python, nebenbei bemerkt, führt den DeprecationWarning, wenn Sie die Methode verwenden. sqlite3.connection zum Beispiel nicht über die Methode überhaupt.
Und die Frage ist, warum gibt es keine solche Methode in dem PEP ist? Ist die Aussage irgendwie optional, ist es genug, um invoke commit () statt?
Lösung 2
Entschied mich zu beantworten:
A Thread über DB API 2.0 Transaktionen in python-Liste und der folgenden Auszug aus dem Buch spürbar SQL die komplette Referenz machen mich glauben, dass DB-API implementiert SQL1 Standardverhalten:
Die erste Version der SQL-Standards (SQL1) definiert eine implizite Transaktion Modus auf der Grundlage der Transaktion Unterstützung in den frühen Versionen von DB2. Bei der impliziten Modus nur die COMMIT und ROLLBACK-Anweisungen unterstützt. EIN automatisch SQL-Transaktion beginnt mit der ersten SQL-Anweisung ausgeführt von einem Benutzer oder einem Programm und endet, wenn ein COMMIT oder ROLLBACK ausgeführt. Das Ende einer Transaktion implizit beginnt eine neue.
Explicit Transaktionsmodus (die SQL2 und SQL: 1999). Scheint praktisch zu sein, wenn die RDBSM unterstützt Autocommitmodus und die aktuelle Verbindung in diesem Modus ist, aber DB-API nicht nur reflektiert es nicht
Andere Tipps
eine dieser zuvor gestellte Frage . Im Allgemeinen wird das „Protokoll“ mit den Transaktionen zu verwenden ist:
cursor = conn.cursor()
try:
cursor.execute(...)
except DatabaseError:
conn.rollback()
raise
else:
conn.commit()
finally:
cursor.close()
aus Python starten 2.6 sqlite Connection
Objekte können als Kontext-Manager verwendet werden, dass automatisch Commit oder Rollback-Transaktionen .