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?

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top