5 Stimmen

Führen Sie in Python eine .sql-Datei mit MySQLdb aus

Ich habe eine .sql-Datei mit einer Reihe von SQL-Abfragen, wobei jede Abfrage über mehrere Zeilen geht. Ich möchte diese Abfragen in MySQL über Python mit MySQLdb ausführen.

sqlite3 hat für diesen Zweck eine "nicht standardmäßige Abkürzung" namens executescript(), aber es scheint keine entsprechende Funktion in MySQLdb zu geben.

Ich habe diese alte Frage von vor 2 Jahren bemerkt, die dasselbe fragt, aber ich fand die Antworten unbefriedigend. Die Antworten besagen im Grunde genommen:

Verwenden Sie subprocess, um den mysql-Befehl auszuführen und ihm Ihre .sql-Datei zu senden.

Dies funktioniert, ist aber ziemlich unelegant und führt unerwünschte Komplexität bzgl. Fehlerbehandlung und dergleichen ein.

Wenn jede Abfrage auf einer einzelnen Zeile steht, führen Sie einfach jede Zeile separat aus.

In meinem Fall erstrecken sie sich jedoch über mehrere Zeilen, daher funktioniert dies nicht.

Wenn jede Abfrage nicht auf einer einzelnen Zeile steht, fügen Sie sie irgendwie zusammen.

Aber wie? Ich meine, ich kann etwas schnell zusammenbasteln, sodass keine Antwort mit halbgaren Antworten notwendig ist, und vielleicht werde ich das am Ende tun, aber gibt es bereits eine etablierte Bibliothek, die dies macht? Ich würde mich mit einer umfassenden und korrekten Lösung wohler fühlen als mit einem Hack.

3voto

Aleksi Torhamo Punkte 6114

MySQLdb scheint dies von Haus aus zu erlauben, Sie müssen nur cursor.nextset() aufrufen, um die zurückgegebenen Result Sets durchzugehen.

db = conn.cursor()
db.execute('SELECT 1; SELECT 2;')

more = True
while more:
    print db.fetchall()
    more = db.nextset()

Wenn Sie absolut sicher sein wollen, dass die Unterstützung dafür aktiviert ist und/oder deaktiviert werden soll, können Sie etwas Ähnliches wie dies verwenden:

MYSQL_OPTION_MULTI_STATEMENTS_ON = 0
MYSQL_OPTION_MULTI_STATEMENTS_OFF = 1

conn.set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON)
# Mehrfachanweisungsausführung hier...
conn.set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_OFF)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X