2009-12-19 9 views
5

tengo las siguientes líneas de código:no puede obtener consulta de origen para trabajar MySQL usando Python módulo MySQLdb

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

Cuando ejecuto mi programa, me sale el siguiente error:

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

Ahora puedo copiar y pasar el siguiente en mysql como una consulta:

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

Y funciona perfecto. Cuando compruebo el registro de consultas para la consulta ejecutada por mi guión, muestra que mi pregunta era la siguiente:

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

Sin embargo, cuando me pega manualmente en y ejecutar, todo el create_site_db.sql se expandió en el query log y muestra todas las consultas sql en ese archivo.

¿Me falta algo aquí sobre cómo mysqldb hace las consultas? Estoy corriendo en una limitación. Mi objetivo es ejecutar un script sql para crear la estructura de esquema, pero no quiero tener que llamar a mysql en un proceso de shell para obtener el archivo sql.

¿Alguna idea? ¡Gracias!

Respuesta

12

como otros han dicho, no se puede utilizar el comando source en MySQLdb API Python

Así, en lugar de correr que, cargue el archivo y ejecutarlo

Digamos que su archivo .sql tiene

create database test; 

Leer el contenido como

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

Un d luego ejecutarlo

cursor.execute(sql); 

Usted obtendrá nueva "prueba" base de datos

+0

¡Muchas gracias! sql = open ("test.sql"). read() hace exactamente lo que quiero. Quería evitar bifurcar un proceso de shell porque no solo se sentía innecesario, sino que también tendría una dependencia de los binarios del cliente mysql que se estaban instalando en el sistema desde el que ejecuté. ¡Gracias por la ayuda de todos! – Chris

+0

De nada, Chris – YOU

3

'fuente' no es un comando SQL, sino un comando interno del cliente de línea de comandos mysql.

7

El comando source es uno de los built-in commands reconocido solo por el cliente de línea de comandos mysql. No es compatible como una declaración que puede ejecutar a través de cualquier API.

Algunas personas piensan que puede simplemente dividir un archivo de script SQL en el terminador de la declaración ";" y llamar al execute() en cada línea que obtenga. Sin embargo, hay numerosos casos de excepción:

  • Las declaraciones que son built-in commands como CONNECT, SOURCE, CHARSET, WARNINGS, QUIT, etc.
  • Tenga en cuenta que los comandos integrados no necesitan terminar en ; por ejemplo DELIMITER .
  • Declaraciones que contienen ; pero no como un terminador, como CREATE TRIGGER.
  • Declaraciones que contienen ; dentro de cadenas literales o comentarios o incluso los identificadores entre comillas.
  • líneas de comentarios.

Para cargar un script SQL mediante programación, tendría que duplicar una buena cantidad de la funcionalidad del cliente mysql. Por lo tanto, es mejor si solo bifurca un proceso para ejecutar realmente ese programa de cliente con el script como entrada.

Consulte también:

1

creo que el comando "fuente" es específico para el ejecutable de shell mysql - no es un comando sql y no se puede interpretar correctamente cuando n ejecutado como una instrucción sql.

Para lograr su objetivo, probablemente necesite leer el archivo de secuencia de comandos y analizarlo en sentencias SQL individuales, luego ejecútelas de a una por vez con el cursor.

2

me encontré con el mismo problema!

Como solución instalé la biblioteca sqlparse y utilicé los resultados sqlparse.split (sql). Tuve que comprobar que sql_parts no incluye líneas en blanco como declaraciones individuales ... De lo contrario, "guau" sqlparse es bastante bueno y ¡exactamente lo que necesitaba!

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: Si no carrera cada declaración en su propia puede obtener el error "Comandos fuera de sincronización, no se puede ejecutar este comando ahora". Solo obtuve este error después de agregar algunas consultas más a mi archivo sql, no la primera vez.

+0

+1 para el FYI. –

+0

no es sql_part.strip() suficiente en lugar del bit de reemplazo? – ssc

+0

Sí, supongo que la tira sería mejor y más portátil (publicación actualizada). – Rescommunes

Cuestiones relacionadas