Comienzo este artículo ya que es algo que he tenido que resolver recientemente y me ha dado ciertos problemas. Importar un fichero CSV en MySQL o MariaDB es algo relativamente sencillo. La forma más inmediata y rápida de hacerlo es vía command line, pero suele costar dar con la tecla con el comando.
Seguramente hayas intentado conectarte a MySQL y a ejecutar algo del estilo a lo siguiente, ya que es lo primero que se suele intentar:
LOAD DATA INFILE 'mifichero.csv'
INTO TABLE mitabla
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
Lo normal, cuando intentamos importar de esta forma un fichero CSV en MySQL es que te de error:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
No te preocupes, aquí te explico cuál es la tecla mágica para dar solución a la importación de los datos.
Importar datos de un CSV en MySQL utilizando LOAD DATA LOCAL INFILE
Para evitar el error de --secure-file-priv
, tenemos dos opciones:
- Configurar MySQL para admitir este tipo de operaciones (requiere reinicio del servicio)
- Conectarte a MySQL añadiendo el parámetro
--local-infile=1
Una vez estamos dentro, lo primero que tendremos que hacer es utilizar el comando LOAD DATA LOCAL INFILE
en lugar de LOAD DATA INFILE
. Con esta instrucción, le decimos a MySQL que el fichero está en nuestro sistema de ficheros.
Otro aspecto a tener en cuenta, utiliza la ruta absoluta fichero que colocamos en el comando, esto hará que no falles a la hora de decirle a MySQL dónde está el fichero. Si no lo encuentra, te encontrarás un error como este:
ERROR 2 (HY000): File 'mifichero.csv' not found (OS errno 2 - No existe el archivo o el directorio)
Además, es muy importante que MySQL/MariaDB tenga permisos de acceso/lectura al fichero. Si no tiene acceso, nos podremos encontrar con errores del estilo:
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
Ahora que tenemos los tres puntos anteriormente descritos:
- Conexión a MySQL con
--local-infile=1
- Activar –local-infile
- Utilizar el parametro
LOCAL
- Ruta absoluta
- Permisos de lectura en el fichero
Vamos con el procedimiento de conexión a MySQL y el comando de importación paso a paso.
Cómo importar datos de un CSV en MySQL vía Command Line
Ya tenemos todas las pistas y problemas identificados. A continuación, los comandos a ejecutar paso a paso.
Primero, nos conectamos a MySQL, nos pedirá la contraseña tras el siguiente comando.
mysql --local-infile=1 -u USUARIO -p
Ahora, seleccionamos la base de datos
use mi_database;
Activamos --local-infile
SET GLOBAL local_infile=1;
Finalmente, armamos el comando de importación de los datos en un fichero CSV a MySQL:
LOAD DATA LOCAL INFILE '/ruta/absoluta/mifichero.csv'
replace
INTO TABLE mi_database
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
Importante que las columnas del CSV estén en el mismo orden que las columnas de la tabla de nuestra base de datos MySQL. En caso de que no sea así, tendremos que especificar el orden, con los nombres de las columnas de la tabla de MySQL, por ejemplo:
LOAD DATA LOCAL INFILE '/ruta/absoluta/mifichero.csv'
replace
INTO TABLE mi_database
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(campo1,campo2,campo3,campo4);
Y listo. El resultado debería ser el siguiente:
Query OK, 183264 rows affected (58,52 sec)
Con esto hemos visto cómo importar los datos de un fichero CSV en la tabla de una base de datos MySQL / MariaDB vía command line. Sin duda, el método más rápido de importación de ficheros CSV.