Estoy ejecutando Ubuntu 12.04 y MySQL 5.5. Bien, este es el problema:
Usando el módulo MySQLDB para Python, el comando SQL:
cursor.execute("LOAD DATA LOCAL INFILE 'example.csv' INTO TABLE 'example_mysql_table' TERMINATED BY ',';")
No funciona Obtengo ERROR 1148: The used command is not allowed with this MySQL version
He buscado una solución para esto por un tiempo, y hasta ahora parece que otras personas que tienen el mismo problema lo han solucionado agregando “local-infile = 1” a ‘my.cnf’ debajo de [mysqld] y [mysql ]. Esto no me ha funcionado, y no estoy seguro de por qué.
Enlace relevante:
MySQL: Habilitar DATOS LOCALES DE LA CARGA
Después de pasar horas probando todo tipo de configuraciones en los archivos de configuración y reiniciando mysql docenas de veces se me ocurrió esto, lo que parece resolver el problema (no se pudo encontrar en ninguna documentación).
MySQLdb.connect(server, username, password, database, local_infile = 1)
Como veo, no hay opción de archivo local-infile . Pero puede cambiar este valor dinámicamente en un script.
Para ver esta opción ejecute esta consulta –
SELECT @@global.local_infile;
Para establecer la variable use esta statement –
SET @@global.local_infile = 1;
Probado en la consola de línea de comandos de MySQL, todo está bien:
SET @@GLOBAL.local_infile = 1; LOAD DATA LOCAL INFILE 'test.csv' INTO TABLE table1; Query OK, 3 rows affected (0.06 sec) SET @@GLOBAL.local_infile = 0; LOAD DATA LOCAL INFILE 'test.csv' INTO TABLE table1; ERROR 1148 (42000): The used command is not allowed with this MySQL version
Sé que este es un tema muy antiguo, pero pensé que solo añadiría una pequeña nota a pie de página con respecto a Flask.
No pude cargar ningún archivo csv a MySQL a través de LOAD DATA INFILE, así que intenté usar LOAD DATA LOCAL INFILE. Obtuve el mismo ‘ERROR 1148: el comando usado no está permitido con esta versión de MySQL’ mencionado anteriormente.
Mi solución a esto fue abrir flaskext> mysql.py y modificar la función ‘conectar’. Yo añadí:
if self.app.config['MYSQL_LOCAL_INFILE']: self.connect_args['local_infile'] = self.app.config['MYSQL_LOCAL_INFILE']
Luego agregué:
app.config['MYSQL_LOCAL_INFILE'] = True
a mi módulo matraz. Esto permite efectivamente que la opción local_infile de pymysql se configure en ‘Verdadero’ cuando se usa flaskext.mysql