DEV Community

Silvio Riveros
Silvio Riveros

Posted on

Migrar de SQLite a MySQL.

Me presento soy Alfredo Riveros y llevo algunos años aprendiendo sobre programación, actualmente estudio Tecnicatura Superior en Desarrollo de Software en la Escuela Superior de Comercio - Río Tercero, y a continuación describiré un desafío con el que me topé.

Como dice el título, mi objetivo fue migrar una base de datos SQLite a MySQL, algo que surgió a partir de una tarea en la materia de base de datos que estoy cursando.

La base de datos que seleccioné pertenece al juego SQL Murder Mystery. Este juego, creado para enseñar habilidades en SQL de forma lúdica, está disponible en este enlace, donde se puede descargar la base de datos proporcionada por sus desarrolladores.

Elegí esta base de datos por su orientación pedagógica, dado que si bien es un juego en sí se constituye como un recurso valioso tanto para la enseñanza como el aprendizaje de conceptos relacionados a base de datos.

Mi primer paso en este desafío fue investigar si podía utilizar DB Browser for SQLite para exportar la base de datos en un formato compatible con MySQL Workbench. Aunque logré generar un script SQL desde DB Browser, la importación en Workbench me presentó numerosos problemas, especialmente de sintaxis y de integridad de datos, además de la complejidad de manejar un archivo tan extenso.

Image description

Image description

Estudié este archivo y busqué solucionar los problemas de sintaxis, y finalmente llegué a la conclusión de que debía de buscar otro enfoque.

Mi siguiente paso fué usar la función de sqlite3 para exportar un script sql mediante la terminal (linux).

Usando SQLite3

Esta vez el script mejoró bastante en sintaxis, pero sin embargo el gran problema es que siempre aparecía uno u otro problema nuevo.

Con ambos enfoques agotados, tomé un momento para reflexionar y evaluar otras alternativas. Consideré que Python podría ser una herramienta eficaz para esta migración, dado su soporte tanto para SQLite como para MySQL, y comencé a diseñar un algoritmo para automatizar el proceso.

Entonces busqué información sobre el tema, verificando primero que fuera un enfoque posible y recolectando información para poder diseñar un algoritmo que me permitiera cumplir con mi meta.

Ahora describiré brevemente el nuevo enfoque con el que obtuve el éxito en mi meta.
Lo primero que hice fue documentar paso a paso mi investigación, lo cual me llevó a conocer algo llamado mapeo objeto-relacional (ORM, por sus siglas en inglés).

El mapeo objeto-relacional (ORM) es una técnica utilizada en programación para convertir datos entre sistemas de tipos incompatibles en lenguajes de programación orientados a objetos. En el contexto de bases de datos, el ORM permite interactuar con bases de datos relacionales a través de objetos en lugar de usar consultas SQL directamente. Esto proporciona una forma más intuitiva y eficiente de trabajar con datos.

En mi caso utilicé SQLAlchemy para llevar adelante la confección del algoritmo en python, y analizando los resultados encontré los siguientes puntos clave.

  • Clases como Tablas:
    • Cada clase que defines (como crime_scene_report, drivers_license, etc.) corresponde a una tabla en la base de datos. Los atributos de la clase representan las columnas de la tabla.
  • Instancias como Filas:
    • Cada instancia de una clase representa una fila en la tabla correspondiente. Cuando consultas datos desde SQLite, obtienes instancias de estas clases, lo que hace que trabajar con datos sea más intuitivo y orientado a objetos.
  • Operaciones de Inserción y Actualización:
    • Usar métodos como merge() permite operar con estas instancias directamente. Puedes insertar nuevos registros o actualizar los existentes sin necesidad de escribir consultas SQL manualmente, lo que simplifica el código y lo hace más legible.
  • Manejo de Relaciones:
    • SQLAlchemy maneja automáticamente las relaciones entre tablas (por ejemplo, a través de claves foráneas) a través de atributos en las clases, lo que facilita la navegación entre registros relacionados.

Image description

Algo importante a destacar durante el proceso, tras varias pruebas y errores, es que comprender el enfoque y evaluar el código escrito resulta crucial, ya que te ayuda a identificar los lugares de donde pueden surgir los problemas. Después de reflexionar y hacer una pausa, llegué a la conclusión de que el inconveniente probablemente estaba relacionado con la estructura de la base de datos. Sin embargo, una pregunta persistía en mi mente: ¿cómo es posible que esta base de datos funcione en SQLite a pesar de presentar problemas de integridad y los diversos errores que aparecían? La respuesta es sencilla: a diferencia de MySQL, SQLite permite tener tablas sin claves primarias, lo que contribuye a grandes diferencias en el manejo de datos entre ambos sistemas. Esta flexibilidad en SQLite puede enmascarar problemas que, en un entorno más restrictivo como MySQL, resultarían en errores inmediatos.

Otra diferencia es que MySQL tiene un enfoque más riguroso respecto a la estructura y los tipos de datos. Por ejemplo, si defines un campo como INTEGER, no podrás insertar un valor que no sea un número.

Las diferencias siguen, el resultado de comprender las mismas fue darme cuenta de que para que el enfoque funcione debería de haber un cambio en la base de datos, para ello decidí modificar las tablas y asegurarme de que cumplieran con los estándares de MySQL, lo primero es que cada una tenga su clave primaria, y asegurarme que ambas tengan los mismos tipos de dato.

Añado... Si usted desea hacer lo mismo tenga en cuenta que SQLite no permite alterar directamente las tablas, otra gran diferencia con MySQL.

Finalmente habiendo hecho las adaptaciones en el script, y en el algoritmo escrito en python, procedí a ejecutarlo. El resultado: Se logró migrar la base de datos del juego a MySQL.

Este desafío no solo mejoró mis habilidades técnicas, sino que también me enseñó la importancia de comprender las diferencias entre sistemas de gestión de bases de datos y cómo estas pueden afectar la integridad de los mismos.

Espero que mi experiencia en la migración de la base de datos de SQLite a MySQL haya sido útil e inspiradora. Cada desafío presenta una oportunidad para aprender y crecer en el mundo de la programación.
¡Gracias por leer y hasta la próxima!

Top comments (0)