En esta entrada del blog, vamos a tratar el cómo exportar una base de datos de una tecnología a otra, en esta ocasión de Access a MySQL, puede ser desde cualquiera a MySQL, mientras logremos del motor anterior, un archivo .CSV con los datos.
Luego de haber desarrollado esta utilidad, y haberla usado sin inconvenientes por buen tiempo, descrubrí que hay otros métodos para exportar una base de datos (disponible en nuestro Workbench), en caso de que eso falle les recomiendo mi solución. Siempre la idea al migrar una base de datos es recuperar la cantidad máxima de registros, asumiendo que puede haber una mínima perdida por inconsistencia de los registros.
Un caso típico de esta migración es que algún cliente nos haya solicitado desarrollar una aplicación, porque la que tiene actualmente está obsoleta, y quiere una tecnología más actual con mejor rendimiento (entre otros posibles motivos), pero sucede que esta empresa actualmente tiene en su aplicación una base de datos Access bastante vieja, entonces ahí es donde comienza el primer requisito, que es migrar los datos al sistema nuevo.
Yo les voy a aportar este mecanismo, la utilidad que desarrollé y uso (que no es mágica, pero haciéndole unas adaptaciones al modelo que desean exportar logra cumplir su función).
Tengamos en cuenta desde un principio, que el proceso de migración se realiza tabla por tabla.
Itinerario
- Paso 1: Exportar tabla de Access a archivo .csv
- Paso 2: Creamos una tabla en una base de datos MySQL idéntica a la que tenemos en Access
- Paso 3: Con la utilidad en Java, exportar desde el .CSV a la base de datos MySQL intermedia
Si repetimos el proceso con todas las tablas, tendremos la base de datos completa, entonces ahora les mostraré como realizar el proceso paso a paso para lograr pasar una tabla desde Access hasta la base de datos Análoga MySQL (luego el pasaje de una bd MySQL a la otra dependerá de los requisitos de nuestra aplicación).
Paso 1: Exportar tabla de Access a archivo .csv
Lo primero es tener el archivo de la base de datos Access, que puede tener la extensión .mdb o .accdb, entonces lo ejecutamos y veremos la lista de tablas:

En este caso tomé una base de datos de prueba de artículos de ferretería que tenía, solo posee esa tabla pero tiene bastantes registros.
Ahora nos dirigimos a la pestaña DATOS EXTERNOS y veremos este panel:

Se divide en dos segmentos, “Importar y vincular” y “Exportar”, en la división de Exportar, clickeamos en “Archivo de Texto”, entonces veremos la siguiente ventana:


Para facilitar el uso del archivo desde java, recomiendo guardarlo en nuestro disco C, y con la extensión .CSV (eso ultimo fundamental).
Información Adicional: CSV es un formato que expresa datos separados por comas (o por algún otro separador), se puede leer como un archivo de texto en el cual, cada línea representará un registro, y dentro de esa línea cada campo estará separado por “;”.
Una vez bien escrita la ruta del archivo seleccionamos “Aceptar”:

En esta imagen visualizamos como sería el formato del archivo final, en el cual podemos hacer unos ajustes si vamos a “Avanzado…”:

En esta ventana tenemos unos ajustes que van a nuestro gusto, yo recomiendo en Cualificador de Texto el parámetro “ninguno” (Para que nos quede solo los valores y separadores).
También les recomiendo una codificación de caracteres UTF-8, para evitar caracteres “bugueados”, una vez hecho esto vamos a “Aceptar” y luego “Siguiente”.

En esta pantalla nos pide delimitador de campos y cualificador de texto que ya lo seleccionamos anteriormente, pero algo fundamental que debe estar desmarcado es “Incluir nombres de campo en la primera fila”, no nos interesa los nombres de los campos en ese fichero, aunque deberemos saberlos a la hora de exportar los datos. Luego de esto simplemente damos en “Finalizar” y ya tendremos nuestro archivo CSV.
Paso 2: Creamos una tabla en una base de datos MySQL idéntica a la que tenemos en Access
Antes que nada debemos saber cuál será la estructura de datos que manejaremos en la migración, para generar la base de datos intermedia, en esta prueba solo tendremos la tabla Artículos, que manejara la siguiente estructura:
CREATE TABLE articulosmigracion (
id varchar(100) DEFAULT NULL,
codigo varchar(100) DEFAULT NULL,
codigoArticulo varchar(100) DEFAULT NULL,
codigoProveedor varchar(100) DEFAULT NULL,
descripcionProveedor varchar(100) DEFAULT NULL,
descripcion varchar(100) DEFAULT NULL,
monedaCompra varchar(100) DEFAULT NULL,
listaEnMonedaOriginal varchar(100) DEFAULT NULL,
costoPesos varchar(100) DEFAULT NULL,
cotizacionDolar varchar(100) DEFAULT NULL,
venta varchar(100) DEFAULT NULL,
margen varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Tengamos en cuenta que en esta etapa no nos interesan las restricciones de integridad, sino que los datos lleguen a su destino y de forma mecanizada (porque en mi caso son 40000 registros a exportar), en el código anterior pueden ver cuáles son los atributos de esa tabla Artículos en Access.
Recordemos previamente crear la database, entonces luego de haber ejecutado esa sentencia DDL, vamos a proceder al siguiente paso.
Paso 3: Con la utilidad en Java, exportar desde el .CSV a la base de datos MySQL intermedia
Bueno ahora les presento la utilidad, que sin más complicaciones la ejecutaremos desde el propio IDE:

La voy a dejar subida en Drive, para su descarga libre, tenemos 4 clases en las cuales debemos ajustar algunos parámetros.
Database.java
Esta clase tiene toda la lógica de comunicación con el servidor de base de datos, todos sus métodos están sumamente testeados y es la base de otros proyectos con persistencia que he realizado, así que solo debemos centrarnos en editar las líneas 12, 13 y 14 que son estas:
private String url="jdbc:mysql://localhost:3306/migracionFerreteria"+"user="+user+"&password="+pass+"&useSSL=false";
private static String user = "root";
private static String pass = "1111";
Es simplemente setear usuario y password de nuestro server de MySQL, y en la url poner la dirección de nuestro server + la base de datos (que en este caso es “migracionFerreteria”).
ArticulosFerreteria.java
Esta clase es la plantilla del objeto que encapsulará la información, tenemos que poner todos los atributos en String (a excepción del ID). Luego debemos centrarnos en el método que está entre las líneas 43 y 63:
public static void insertarArticulos(ArrayList<ArticulosFerreteria> listado) throws Exception, SQLException {
ArrayList<String> listaSQL = new ArrayList<>();
for (ArticulosFerreteria a : listado) {
String sql = "INSERT INTO articulosMigracion (id, codigo, codigoArticulo, codigoProveedor, descripcionProveedor, descripcion, monedaCompra, listaEnMonedaOriginal, costoPesos, cotizacionDolar, venta, margen) values" + " ('" + a.id + "','" + a.codigo + "','" + a.codigoArticulo + "','" + a.codigoProveedor + "','" + a.descripcionProveedor + "'," + "'" + a.descripcion + "','" + a.monedaCompra + "','" + a.listaEnMonedaOriginal + "', '" + a.costoPesos + "', '" + a.cotizacionDolar + "' , '" + a.venta + "' , '" + a.margen + "');";
listaSQL.add(sql);
System.out.println("GENERANDO SENTENCIAS SQL: " + sql);
}
int cantRegistrosPerdidos = 0, nroRegistro = 0;
for (String item : listaSQL) {
if (Database.getInstancia().actualizar(item) == -1) {
cantRegistrosPerdidos++;
}
System.out.println("Insertando registro nro: " + nroRegistro + ". Registros perdidos: " +
cantRegistrosPerdidos);
nroRegistro++;
}
System.out.println("Cantidad de registros perdidos en la migración: " + cantRegistrosPerdidos);
}
Simplemente debemos adaptar la sentencia SQL de inserción, según los atributos que tengamos.
mainMigracion.java
En el main simplemente invocamos a la utilidad, debemos adaptar las líneas 11 y 12 según el nombre del objeto y métodos a utilizar.
ArrayList<ArticulosFerreteria> listado = lector.obtenerArticulosFerreteria();
ArticulosFerreteria.insertarArticulos(listado);
LectorTXT.java
En la clase LectorTXT tenemos dos métodos que no nos interesa tocar (que son isNumeric y read), en el método obtenerArticulosFerreteria debemos realizar unas adaptaciones:
Primero que nada adaptar su nombre y tipo de retorno al objeto que vamos a usar, luego en la línea 37 tenemos que especificar la ruta de nuestro archivo .CSV.
En la línea 40 especificamos el separador que se utiliza para los campos (en caso de que hayamos puesto uno distinto a “;” en el proceso migratorio de Access).
En la línea 41 especificamos el largo del array que contendrá cada conjunto de campos, debe ser superior a la cantidad de campos que contiene nuestra tabla.
Esas son las líneas generales para pasar del .CSV a MySQL, puede surgir algún inconveniente que se arregla simplemente con su Debug correspondiente.
La herramienta que yo les proporciono, les muestra en consola durante el proceso lo que está haciendo, pudiendo ver cuándo se están generando las sentencias SQL de inserción, y cuando se están ejecutando las mismas (visualizando también la cantidad de registros que dieron error y no se pudieron insertar).


El Paso 4 queda a tu criterio según las modificaciones que debas hacer con subconsultas en los datos para pulir el modelo final.
Aqui les dejo el Link del CSV2MySQL.
Si te fue útil la herramienta que codifiqué, puedes invitarme un cafe.