Creando scripts de migración SQL automatizadamente
En el proyecto en el cual estoy trabajando decidimos finalmente migrar la aplicación base a su versión más nueva. Esto supone muchísimo trabajo, no es solamente pisar los archivos de la aplicación con los de su versión más nueva y listo el pollo, ojalá!
Una de las tareas de la migración, es migrar el esquema de la base de datos a su versión más nueva y hacer esto a mano no solo es cansador si no que también es super propenso a errores. Así que me puse a buscar una herramienta que me ayude en esto.
Básicamente lo que necesitaba era una herramienta a la cual yo le pasara como parámetro el esquema de 2 bases de datos (El actual y el de la nueva versión) y me escribiera scripts SQL para llevar el esquema de la base vieja al de la nueva.
Y como pasa el 99% de las veces en el Software Libre, alguien ya lo resolvió antes. La herramienta en cuestión se llama: sqlt-diff
Entonces, para migrar del esquema de la BaseA1 al esquema de la BaseA2 hay que seguir los siguientes pasos:
1.- Hacer un dump del esquema de cada base, en mi caso ejecuté:
$ mysqldump -uUsuario -pPassWordSuperSegura -h servidorMySQL --database basea1 -d > basea1.sql $ mysqldump -uUsuario -pPassWordSuperSegura -h servidorMySQL --database basea2 -d > basea2.sql
La opción «-d» de mysqldump hace que el archivo sql no tenga datos, es decir sólo la estructura.
2.- Instalar sqlt-diff
En Debian y en Ubuntu el paquete que trar esta utilidad es «libsql-translator-perl» y se instala:
3- Modificar archivos basea1.sql y basea2.sql antes de ejecutar sqlt-diff
No tuve tiempo de investigar por qué, pero a sqlt-diff no le gustan los dumps que tengan la sentencia de creación de la DB y de uso de esa misma DB. así que simplemente comenté esas líneas en los 2 archivos:
-- CREATE DATABASE /*!32312 IF NOT EXISTS*/ `basea1` /*!40100 DEFAULT CHARACTER SET utf8 */; -- USE `basea1`;
4.- Ejecutar sqlt-diff
Ejecutar esto es bien sencillo:
Esto nos produce un archivo diff.sql que tiene todas las sentencias necesarias (CREATE TABLE, ALTER TABLE, DROP TABLE, etc) para ejecutar en la DB basea1 y que nos quede igual a basea2
En mi caso ese archivo tiene adentro algo como esto:
BEGIN; SET foreign_key_checks=1; ALTER TABLE accounts CHANGE COLUMN annual_revenue annual_revenue VARCHAR(100) NULL DEFAULT NULL, CHANGE COLUMN phone_fax phone_fax VARCHAR(100) NULL DEFAULT NULL, CHANGE COLUMN rating rating VARCHAR(100) NULL DEFAULT NULL, CHANGE COLUMN phone_office phone_office VARCHAR(100) NULL DEFAULT NULL, CHANGE COLUMN phone_alternate phone_alternate VARCHAR(100) NULL DEFAULT NULL, ADD INDEX idx_accnt_name_del (name, deleted); ALTER TABLE accounts_audit CHANGE COLUMN id id CHAR(36) NOT NULL, ADD INDEX idx_accounts_parent_id (parent_id), ADD PRIMARY KEY (id);