2012-05-15 94 views
5

Tengo un archivo .sql que contiene un conjunto de consultas SQL, con cada consulta abarcando varias líneas. Quiero ejecutar estas consultas en MySQL a través de Python usando MySQLdb.Ejecutar archivo .sql en Python con MySQLdb

sqlite3 has "a nonstandard shortcut" for this purpose called executescript(), pero no parece haber ninguna función equivalente en MySQLdb.

Me di cuenta de this old question from 2 years ago que pregunta lo mismo, pero encontré las respuestas insatisfactorias. Las respuestas son básicamente:

Uso subprocess para ejecutar el comando mysql y lo envía su archivo .sql.

Esto funciona, pero es bastante poco elegante, y presenta complejidad no deseada con el manejo de errores y tal.

Si cada consulta está en una sola línea, simplemente ejecute cada línea por separado.

Pero en mi caso, abarcan varias líneas, por lo que esto no funcionará.

Si cada consulta no está en una sola línea, únelas de algún modo.

Pero, ¿cómo? Quiero decir, puedo hackear algo con bastante facilidad, así que no hay necesidad de que respondas con respuestas a medias aquí, y tal vez eso es lo que terminaré haciendo, pero ¿ya existe una biblioteca establecida que hace esto? Me sentiría más cómodo con una solución integral y correcta en lugar de un truco.

+0

que había presentado una respuesta que invovled analizar el archivo y creación de las consultas, pero creo que eso es lo que quería decir con "un truco", así que lo eliminé. – acattle

Respuesta

3

MySQLdb parece permitir esto fuera de la caja, solo tiene que llamar al cursor.nextset() para recorrer los conjuntos de resultados devueltos.

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

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

Si usted quiere estar absolutamente seguro de que el apoyo a esta opción está activada, y/o deshabilitar el soporte, se puede usar algo como esto:

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

secuencias de comandos de MySQL .sql contienen algunas órdenes internas [] (http://dev.mysql.com/doc/refman/5.6/en/mysql-commands.html) que son procesados ​​por el cliente 'mysql', pero no son reconocidos por el analizador de SQL en el servidor. Por lo tanto, aunque MySQLdb puede admitir consultas múltiples, no se puede alimentar con ningún script .sql arbitrario como entrada. –

+0

@aleksi, asume suposiciones peligrosas: no creo que trabaje en un archivo grande (x100MB +), ni siquiera más pequeño. No hay generador en los comandos. Incluso configurar un generador de comandos es difícil ya que necesita un analizador de archivos SQL; línea por línea no necesariamente funcionaría. spliiting por punto y coma es malo. etc. –

+0

@BerryTsakala: Me está costando mucho darle sentido a tu comentario. Eso dicho; Sí, hago suposiciones, este método no funcionará para todos los casos de uso (como ya se señaló en el ejemplo anterior), pero es más o menos exactamente lo que esta pregunta requería. ¿Y a qué [en la tierra] te refieres con "peligroso"? Esto es bastante seguro, a diferencia de intentar analizar las consultas SQL usted mismo. Sí, esto no funcionará para archivos grandes, te toparías con el tamaño máximo de paquete de MySQL. ¿Por qué estás hablando de analizar SQL porque este método explícitamente ** evita ** eso? –

Cuestiones relacionadas