Convertir una base de datos Access a MySQL (II)

Continúo con mi experiencia de convertir una base de datos realizada en Access a instrucciones SQL. Hace unas horas estaba contándole estas experiencias a un informático amigo, y su solución no es muy ortodoxa, o al menos a mi no me convence. La paso a explicar.

Él trabaja sobre .NET, enlaza el archivo .mdb mediante ODBC, de manera que vincula la base de datos con una aplicación web vacía, y es capaz de darle nombre a cada uno de los vínculos. Luego decide cómo son los vínculos: combos, menús desplegables, check buttons, etc.

Esta manera no me convence, por varias razones. La primera de ellas, porque necesita utilizar un framework, en este caso, Visual Basic .NET, cuya licencia ya vale un pastizal. La segunda, porque este framework sólo funciona en Windows.

Así que las dos primeras razones implican que está utilizando un software privativo. Por otro lado, la tercera razón por la que no me gusta esta manera es porque mantiene al archivo en Access. Para gestionar la base de datos, prefiero utilizar motores SQL, en cualquiera de sus variantes GPL, pero prefiero MySQL y MariaDB.

Así pues, sigo intentado convertir el archivo a SQL. Y tras varios intentos infructuosos, decidí intentarlo con mdbtools. De las posibles órdenes de consola que permite, las útiles son éstas:

mdb-tables archivo.mdb
mdb-schema archivo.mdb > tablas.sql
mdb-export archivo.mdb tabla1 > tabla1.txt

La primera orden lista las tablas disponibles. La segunda genera el esquema (la estructura) de las tablas. La tercera extrae la información de la tabla en un fichero de texto plano. Veamos qué hacer después.

La estructura de la base de datos

En efecto, con la orden

mdb-schema archivo.mdb > tablas.sql

genera un archivo con instrucciones SQL. Sin embargo, tenemos que editar ligeramente las órdenes:

DROP TABLE registro;
CREATE TABLE registro
 (
	DNI			Long Integer (4), 
	NOMBRE			Text (100), 
	FENAC			DateTime (Short) (8), 
	CATEGORIA			Text (100), 
	NUMERO EMPLEADO			Double (8), 
	ID PUESTO			Text (20), 
	ACTIVO			Boolean
);

Como vemos, hay tipos de datos que no tiene nada que ver con el mundo real, como Long Integer, Double, etc. Asimismo, vemos que el nombre del campo tiene un espacio en blanco. En realidad, la sentencia SQL debería ser así:

DROP TABLE IF EXISTS registro;
CREATE TABLE registro
 (
	DNI			VARCHAR (4), 
	NOMBRE			Text (100), 
	FENAC			DATETIME, 
	CATEGORIA			Text (100), 
	NUMERO_EMPLEADO			VARCHAR (8), 
	ID_PUESTO			Text (20), 
	ACTIVO			Boolean
);

Las tablas de la base de datos

Al igual que en el caso anterior, tendremos que editar levemente la tabla generada.

DNI,NOMBRE,FENAC,CATEGORIA, NUMERO EMPLEADO, ID PUESTO, ACTIVO
104662,"RAFAEL","08/02/59","EMPLEADO","123", "456", 1

Los tipos de datos concuerdan, pero la primera línea no debería estar allí, porque si bien es bastante autoexplicativa, no permite cargar los datos a la tabla.

¿Qué tenemos que hacer? En primer lugar, eliminar la línea número 1. Después, entrar en una shell de MySQL y hacer lo siguiente:

USE base_datos;
DELETE FROM registro;
LOAD DATA LOCAL INFILE "tabla1.txt" INTO TABLE registro FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';

Ahora sí que tenemos cargados los registros de tabla1.txt dentro de la tabla registro, dentro de base_datos.

El paso de extraer cada tabla sí que se puede hacer mediante Access:

  • Se abre la base de datos;
  • se elige la tabla en cuestión;
  • se Guarda como archivo de texto, en el que tendremos que definir que cada campo esté delimitado con una coma (,) o un punto y coma (;).

Y ya tenemos la tabla lista para ser cargada dentro de la base de datos. El problema es que hacer este ejercicio con 23 tablas es algo tedioso, por eso no utilicé la herramienta de exportación que tiene Access, y directamente me pasé a mdbtools.

Uso avanzado, pero poco útil

Antes de llegar a la conclusión de utilizar mdbtools y la shell de MySQL, había encontrado otra manera de hacer las cosas, pero es, con diferencia, mucho más complicada.

Consiste en generar una instrucción de este tipo:

INSERT INTO tabla1 (campo1, campo2) VALUES (v1, v2),
(v3, v4),
(v5, v6),
...

El problema es que, como ya he mencionado antes, los datos no están formateados: necesitaría colocar paréntesis al principio y al final de cada línea (y son tablas de unas 2000 líneas). Podría ahorrar las definiciones de los campos (eliminaría (campo1, campo2)), pero aún existe el problema de insertar caracteres al principio y al final de las líneas.

Para este menester, existe la herramienta sed de GNU/Linux. El uso de sed es bastante complicado, así que únicamente mostraré las órdenes que utilicé.

En primer lugar, insertar ( al principio de la línea:

sed 's/^/(/' tabla.txt > tabla2.txt

Para insertar ), al final de la línea:

sed 's/$/),/' tabla2.txt > tabla3.txt

Así, ya tenemos unas líneas así:

INSERT INTO tabla1
(104662,"RAFAEL","08/02/59","EMPLEADO","123", "456", 1),
(104664,"MANUEL","08/04/87","EMPLEADO","124", "458", 1),
(104664,"JOSE","08/12/96","EMPLEADO","125", "457", 1),

Esta instrucción SQL ya la podemos pasar por la shell o por aplicaciones web como PhpMyAdmin.

Creado el 22 junio 2012, 21:31 by Rafa

Escribe un Comentario

Puedes utilizar textile en el comentario.

Comentarios