2012-05-15 11 views
5

Ho un file .sql contenente un gruppo di query SQL, con ogni query che si estende su più righe. Voglio eseguire queste query in MySQL tramite Python utilizzando MySQLdb.Esegui il file .sql in Python con MySQLdb

sqlite3 has "a nonstandard shortcut" for this purpose called executescript(), ma non sembra esserci alcuna funzione equivalente in MySQLdb.

Ho notato this old question from 2 years ago che chiede la stessa cosa, ma ho trovato le risposte insoddisfacenti. Le risposte sono fondamentalmente:

Usa subprocess per eseguire il comando mysql e inviare il vostro file sql.

Questo funziona, ma è piuttosto inelegante e introduce complessità indesiderate con la gestione degli errori e così via.

Se ogni query è su una singola riga, è sufficiente eseguire ogni riga separatamente.

Ma nel mio caso, si estendono su più righe, quindi questo non funzionerà.

Se ogni query non è su una singola riga, in qualche modo unirsi a loro.

Ma come? Voglio dire, posso incidere qualcosa abbastanza facilmente, quindi non c'è bisogno che tu risponda con le risposte un po 'cotta qui, e forse è quello che finirò a fare, ma c'è già una biblioteca consolidata che fa questo? Mi sentirei più a mio agio con una soluzione completa e corretta piuttosto che un trucco.

+0

avevo presentato una risposta che invovled l'analisi del archiviare e costruire le query ma penso che sia ciò che intendevi per "un hack", quindi l'ho cancellato. – acattle

risposta

3

MySQLdb sembra consentire questo fuori dalla scatola, basta chiamare cursor.nextset() per scorrere i set di risultati restituiti.

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

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

Se si vuole essere assolutamente certi che il supporto per questo è abilitato, e/o disattivare il supporto, si può usare qualcosa di simile:

MYSQL_OPTION_MULTI_STATEMENTS_ON = 0 
MYSQL_OPTION_MULTI_STATEMENTS_OFF = 1 

conn.set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_ON) 
# Multiple statement execution here... 
conn.set_server_option(MYSQL_OPTION_MULTI_STATEMENTS_OFF) 
+0

Gli script MySQL .sql contengono alcuni [comandi incorporati] (http://dev.mysql.com/doc/refman/5.6/en/mysql-commands.html) che vengono elaborati dal client 'mysql', ma non vengono riconosciuti dal parser SQL nel server. Quindi, anche se MySQLdb può supportare la multi-query, non è possibile alimentare alcun script .sql arbitrario come input. –

+0

@aleksi si assume presupposti pericolosi: non penso che lavorerò su un file di grandi dimensioni (x100 MB +), nemmeno più piccolo. Non c'è alcun generatore sui comandi. Anche l'impostazione di un generatore di comandi è difficile poiché è necessario un parser di file SQL; linea per linea non funzionerebbe necessariamente. lo spliiting di punto e virgola è cattivo. ecc. –

+0

@BerryTsakala: sto attraversando un periodo difficile per dare un senso al tuo commento. Detto ciò; Sì, faccio delle ipotesi, questo metodo non funzionerà per ogni caso d'uso (come già notato da Bill sopra), ma è più o meno esattamente ciò che questa domanda ha richiesto. E che [sulla terra] intendi con "pericoloso"? Questo è abbastanza sicuro come si ottiene, a differenza di cercare di analizzare le query SQL te stesso. Sì, questo non funzionerà con file enormi, ti imbatterai nella dimensione massima del pacchetto MySQL. Perché parli di analisi di SQL poiché questo metodo esplicitamente ** evita ** quello? –