MySQLdb.cursor.execute kann nicht mehrere Abfragen ausführen

8

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?

    
l0b0 11.12.2013, 12:05
quelle

4 Antworten

3

Offenbar gibt es keine Möglichkeit, dies in MySQLdb (aka. MySQL-python ) zu tun, also wir endete nur communicate ing die Daten zu subprocess.Popen([mysql, ...], stdin=subprocess.PIPE) und überprüft die returncode .

    
l0b0 12.12.2013, 09:08
quelle
7

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:

%Vor%

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.

    
Martijn Pieters 21.03.2016 01:37
quelle
3

Ich denke, Sie müssen multi=True an execute übergeben, wenn Sie mehrere Anweisungen verwenden, siehe Ссылка

Update: Dies gilt für das mysql.connector -Modul, nicht MySQLdb in diesem Fall.

    
Johannes 11.12.2013 12:28
quelle
0

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:

%Vor%

Es wird immer nur mit den Anweisungen DROP TABLE und CREATE TABLE gespeist, funktioniert aber für mich.

Ссылка

    
morganwahl 08.11.2016 19:21
quelle

Tags und Links