2009-12-19 10 views
5

ho le seguenti righe di codice:Non è possibile ottenere query di origine MySQL per lavorare utilizzando il modulo MySQLdb Python

sql = "source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql" 
cursor.execute (sql) 

Quando eseguo il mio programma, ottengo il seguente errore:

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'source C:\My Dropbox\workspace\projects\hosted_inv\create_site_db.sql' at line 1

Ora posso copiare e incollare quanto segue in mysql come una query:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql 

E funziona perfettamente. Quando controllo il log delle query per la query eseguita da mio script, dimostra che la mia domanda era la seguente:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql 

Tuttavia, quando incollo manualmente ed eseguire in, l'intero create_site_db.sql viene ampliato nel registro delle query e mostra tutte le query SQL in quel file.

Mi manca qualcosa qui su come mysqldb esegue query? Sto incontrando una limitazione. Il mio obiettivo è quello di eseguire uno script sql per creare la struttura dello schema, ma non voglio dover chiamare mysql in un processo shell per l'origine del file sql.

Qualche idea? Grazie!

risposta

12

Come altri hanno detto, non è possibile utilizzare il comando source in MySQLdb Python API

Così, invece di correre che, caricare il file ed eseguirlo

Diciamo tuo file sql ha

create database test; 

Leggere il contenuto come

sql=open("test.sql").read() 

An d poi eseguirlo

cursor.execute(sql); 

Otterrete nuovo "test" banca dati

+0

Grazie mille! sql = open ("test.sql"). read() fa esattamente quello che voglio. Volevo evitare di biforcarsi un processo di shell perché non solo non sembrava inutile, ma avrei avuto una dipendenza dai binari del client mysql installati sul sistema da cui eseguivo. Grazie per l'aiuto di tutti! – Chris

+0

Prego Chris – YOU

3

'source' non è un comando SQL, ma un comando interno del client della riga di comando mysql.

7

Il comando source è uno dei built-in commands riconosciuto solo dal client della riga di comando mysql. Non è supportato come una dichiarazione che puoi eseguire tramite qualsiasi API.

Alcune persone pensano che si possa semplicemente dividere un file di script SQL sul terminatore dell'istruzione ";" e chiamare execute() su ogni riga che si ottiene. Ma ci sono numerosi casi di eccezione:

  • Dichiarazioni che sono built-in commands come CONNECT, SOURCE, CHARSET, WARNINGS, QUIT, ecc
  • Si noti che i comandi incorporati non devono terminare in ; per esempio DELIMITER .
  • Dichiarazioni contenenti ; ma non come terminatore, ad esempio CREATE TRIGGER.
  • Dichiarazioni che contengono ; all'interno di stringhe letterali o commenti o persino identificatori citati.
  • righe di commenti.

Per caricare uno script SQL a livello di codice, è necessario duplicare una discreta quantità di funzionalità del client mysql. Quindi è meglio se si biforca un processo per eseguire effettivamente quel programma client con lo script come input.

Consulta anche:

1

credo che il comando "fonte" è specifico per l'eseguibile di shell mysql - non è un comando sql e non può essere interpretato correttamente whe n eseguito come istruzione sql.

Per raggiungere l'obiettivo, è probabilmente necessario leggere il file di script e analizzarlo in singole istruzioni SQL, quindi eseguirle una alla volta con il cursore.

2

Ho incontrato lo stesso problema!

Come soluzione ho installato la libreria sqlparse e utilizzato i risultati sqlparse.split (sql). Dovevo controllare che sql_parts non includesse le righe vuote come asserzioni solite ... Altrimenti "WOW" sqlparse è piuttosto grande ed esattamente quello di cui avevo bisogno!

import sqlparse 
.... 
sql = open("test.sql").read() 
sql_parts = sqlparse.split(sql) 
for sql_part in sql_parts: 
    if sql_part.strip() == '': 
     continue 
    cursor.execute(sql_part) 

FYI: Se non eseguire ogni dichiarazione sul proprio è possibile ottenere l'errore "Comandi fuori sincrono, non è possibile eseguire questo comando ora". Ho ricevuto questo errore solo dopo aver aggiunto altre query al mio file sql, non la prima volta.

+0

+1 per la comoda FYI. –

+0

non è sql_part.strip() abbastanza invece del bit di sostituzione? – ssc

+0

Sì, suppongo che la striscia sarebbe migliore e più portabile (post aggiornato). – Rescommunes

Problemi correlati