Wir versuchen, SQL-Dateien mit mehreren INSERT-Anweisungen als einzelne Abfrage auszuführen, aber es scheint, dass rollback
fehlschlägt, wenn eine der Anweisungen einen Fehler enthält.
MySQLd Konfiguration:
%Vor%Python-Code:
%Vor%Erwartetes Ergebnis: "Ausnahme ausgelöst" und "Zurückgerollt" wurden zweimal gedruckt.
Tatsächliches Ergebnis mit MySQL-Python 1.2.4:
%Vor% Was gibt? Müssen wir wirklich die SQL analysieren, um Anweisungen aufzuteilen (mit allen damit verbundenen Escape- und Quote-Handling), um sie in mehreren execute
s auszuführen?
Wie alle Python-DB-API 2.0-Implementierungen ist die cursor.execute()
-Methode nur für die Verwendung konzipiert one -Anweisung, weil sie danach Garantien über den Status des Cursors gibt.
Verwenden Sie stattdessen die Methode cursor.executemany()
. Beachten Sie Folgendes: gemäß der DB-API 2.0-Spezifikation :
Die Verwendung dieser Methode für eine Operation, die eine oder mehrere Ergebnismengen erzeugt, stellt ein undefiniertes Verhalten dar, und die Implementierung ist erlaubt (aber nicht erforderlich), eine Ausnahme auszulösen, wenn sie feststellt, dass eine Ergebnismenge durch einen Aufruf der Operation.
Dies für mehrere INSERT
-Anweisungen zu verwenden, sollte gut sein:
Wenn Sie eine Reihe unterschiedlicher Anweisungen wie aus einem Skript ausführen müssen, können Sie in den meisten Fällen die Anweisungen in ;
aufteilen und jede Anweisung separat in cursor.execute()
einspeisen.
Die Verwendung des Programms mysql
über Popen wird definitiv funktionieren. Wenn Sie jedoch nur eine bestehende Verbindung (und einen Cursor) verwenden möchten, enthält das sqlparse
-Paket eine split
-Funktion, die in Anweisungen aufgeteilt wird. Ich bin nicht sicher, wie die Kompatibilität ist, aber ich habe ein Skript, das tut:
Es wird immer nur mit den Anweisungen DROP TABLE und CREATE TABLE gespeist, funktioniert aber für mich.
Tags und Links python mysql mysql-python