Joomla y MySQL: cargar datos con LOAD DATA y mysqlimport

Además del comando INSERT del SQL, en MySQL podemos cargar datos en la base de datos mediante "LOAD DATA INFILE" y mysqlimport. LOAD DATA y mysqlimport tienen la ventaja de trabajar con ficheros en formato csv (valores separados por comas), con lo que nos ahorramos el formateo de cada registro necesario con INSERT. Si tenemos una hoja de cálculo con datos, la podemos insertar tal cual en la base de datos MySQL con tal de que las columnas de la hoja de cálculo y los campos de la tabla en la bbdd se correspondan. Símplemente convertimos el fichero de la hoja de cálculo a formato *.csv mediante "guardar como..." y listo. Por otro lado, la carga de datos con LOAD DATA y mysqlimport es más rápida y eficiente. Veamos un par de ejemplos:

 

Ejemplo 1

Supongamos que quiero cargar en la base de datos MySQL de la máquina con IP 1.2.3.4, una tabla con muchos datos. Podría usar el siguiente comando:
mysqlimport -u root -p -h 1.2.3.4 --compress --local  --fields-terminated-by=',' --fields-enclosed-by='"' nombre_bbdd  tabla.csv

El comando me pedirá la password (-p) del usuario root (-u) en la máquina (-h) 1.2.3.4. Los datos se enviarán comprimidos (--compress) para disminuir el ancho de banda consumido. El formato del fichero (tabla.csv) deberá ser tal que los campos esten separados con comas (--fields-terminated-by=',') y encerrados entre comillas dobles (--fields-enclosed-by='"'). El nombre de la base de datos con la que se trabajará será "nombre_bbdd". OJO al parche: ¿Cómo sabe mysqlimport en que tabla de la bbdd insertará los datos? Extrae el nombre de la tabla del nombre del fichero que le pasamos eliminando la extensión csv, en este caso "tabla". Obviamente, para que el programa mysqlimport funcione, se habrá debido configurar apropiadamente el acceso mediante usuario remoto.

Ejemplo 2

Mediante el cliente "mysql -u root -p -h 1.2.3.4" hemos accedido y estamos administrando la base de datos MySQL y queremos cargar los datos de la hoja de cálculo en una tabla mediante LOAD DATA INFILE. Podremos usar el siguiente comando:

LOAD DATA LOCAL INFILE 'PATH/file.csv' INTO TABLE tabla FIELDS TERMINATED BY ',' ENCLOSED BY '"'

Es equivalente al comando antes indicado, con la pequeña excepción de que ahora sí indicamos el nombre de la tabla, por lo que la hoja de cálculo puede tener un nombre arbitrario.

Ejemplo 3

Supongamos que estamos programando un componente de Joomla y queremos que los datos se carguen en la instalación del componente. Para ello deberemos, realizar las siguientes tareas:

  1. Incluir la hoja de cálculo con los datos, en el zip del componente. Normalmente se incluye en la carpeta "sql" situada en el backend.
  2. Declarar la hoja de cálculo con los datos en el manifiesto XML del componente.
  3. Declarar el script de creación de la tabla y de carga de datos en el manifiesto XML del componente. Es decir en my_comp.xml, incluir:

<install>
<sql>
<file driver="mysql" charset="utf8">sql/cargaDatos.sql</file>
</sql>
</install>
<administration>
<files folder="backend">
<filename>sql/cargaDatos.sql</filename>
<filename>sql/datos.csv</filename>
</files>
</administration>

4. Crear el script de creación de la base de datos y carga de datos. Almacenar este fichero en el directorio sql del backend junto la hoja de cálculo. El script sería algo parecido a:


DROP TABLE IF EXISTS `#__tabla`;

CREATE TABLE `#__tabla` (
`id` int unsigned NOT NULL DEFAULT '0',
`name` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

LOAD DATA LOCAL INFILE './components/com_selectajax/sql/file.csv' INTO TABLE `#__tabla` FIELDS TERMINATED BY ',' ENCLOSED BY '"';

y eso es todo... los datos se cargarán de la hoja de cálculo en el momento de la instalación de nuestro componente Joomla