Importar fichero CSV en MySQL / MariaDB vía command line

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.

Ibai

Apasionado por la tecnología, el software, las interfaces de usuario (UX UI) y los sistemas. Utilizo este canal de comunicación para transmitir de manera informal, y muchas veces "rápido", pequeñas aportaciones a la comunidad software.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.

*

Artículos relacionados