Artículo original: How to Perform Database Migrations using Go Migrate

Desde su introducción, el lenguaje de programación Go (también conocido como Golang) se ha convertido cada vez más popular. Es conocido por su simplicidad y rendimiento eficiente, similar a un lenguaje de bajo nivel como C++.

Mientras se trabaja con una base de datos, la migración de esquema es una de las tareas más importantes que los desarrolladores hacen a lo largo del ciclo de vida del proyecto. En este artículo, te explicaré qué es una migración de base de datos y cómo hacerlo usando go-migrate.

¿Qué es una Migración de Base de Datos?

Una migración de base de datos, también conocido como una migración de esquema, es un conjunto de cambios que serán hechos a una estructura de objetos dentro de una base de datos relacional.

Es una forma de realizar e implementar cambios incrementales a la estructura de datos de una forma controlada y programática. Estos cambios son frecuentemente reversibles, lo que significa que se pueden deshacer o retrotraerse si se requiere.

El proceso de migración ayuda en cambiar el esquema de la base de datos desde su estado actual a un nuevo estado deseado, ya sea que implique agregar tablas y columnas, remover elementos, separar campos, o cambiar tipos y restricciones.

Al manejar estos cambios de una forma programática, se vuelve más fácil de mantener la consistencia y la precisión en la base de datos, así también como mantener un registro del historial de modificaciones que se le hizo.

Configuración e Instalación

migrate es una herramienta CLI que puedes usar para ejecutar migraciones. Puedes instalarlo fácilmente en varios sistemas operativos tales como Linux, Mac y Windows usando gestores de paquetes como curl, brew, y scoop, respectivamente.

Para más información en cómo instalar y usar la herramienta, puedes referirte a la documentación oficial.

Para instalar la herramienta CLI de migrate usando scoop en Windows, puedes seguir estos pasos:

$ scoop install migrate

Para instalar la herramienta CLI de migrate usando curl en Linux, puedes seguir estos pasos:

$ curl -L https://packagecloud.io/golang-migrate/migrate/gpgkey| apt-key add -
$ echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/migrate.list
$ apt-get update
$ apt-get install -y migrate

Para instalar la herramienta CLI de migrate usando brew en Mac, puedes seguir estos pasos:

$ brew install golang-migrate

Cómo crear una nueva migración

Crear un directorio como database/migration para almacenar todos los archivos de migración.

image-263
Estructura de archivos fuentes en el IDE GoLand

Luego, crea archivos de migración usando el siguiente comando:

$ migrate create -ext sql -dir database/migration/ -seq init_mg
image-267
Salida de terminal mostrando mensaje de creación de migración exitoso

Usas -seq para generar una versión secuencial y init_mg es el nombre de la migración.

image-269
Estructura de archivos fuentes en el IDE GoLand

Una migración típicamente consiste de dos archivos distintos, uno para mover la base de datos a un nuevo estado (denominado como "up") y otro para revertir los cambios hechos al estado previo (denominado como "down").

El archivo "up" se usa para implementar los cambios deseados a la base de datos, mientras que el archivo "down" se usa para deshacer esos cambios y volver a la base de datos a su estado previo.

Database-migration
Flujo de migración de una base de datos

El formato de esos archivos para SQL son:

{version}_{título}.down.sql
{version}_{título}.up.sql

Cuando creas archivos de migración, estarán vacíos por defecto. Para implementar los cambios que quieres, necesitarás rellenarlos con las solicitudes SQL apropiadas.

image-282
Solicitudes SQL para migración de datos

Cómo ejecutar la Migración Up

Para ejecutar sentencias de SQL en los archivos de migración, la migración requiere de una conexión válida a una base de datos Postgres.

Para lograr esto, necesitarás proveer una cadena de conexión en el formato apropiado.

$ migrate -path database/migration/ -database "postgresql://username:secretkey@localhost:5432/database_name?sslmode=disable" -verbose up

Ahora, en tu terminal de Postgres, puedes verificar las nuevas tablas creadas usando los siguientes comandos:

\d+

\d+ nombre_tabla DESCRIBE TABLE
image-286
Mostrando datos de tabla en Postgres

Cómo retrotraer migraciones

Si quieres revertir la migración, puedes hacerlo usando la siguiente etiquta down:

$ migrate -path database/migration/ -database "postgresql://username:secretkey@localhost:5432/database_name?sslmode=disable" -verbose down

Eliminará la columna email de ambas tablas como se menciona en el archivo 000002_init_mg.up.sql.

Ahora, verifiquemos la base de datos y veamos si email ha sido eliminado o no:

Screenshot_20230126_102731
Mostrando datos de tablas actualizados en Postgres

Cómo resolver Errores de Migración

Si una migración contiene un error y se ejecuta, migrate evitará que cualquier migración se ejecute en la misma base de datos.

Un mensaje de error como Dirty database version 1. Fix and force version se mostrará, incluso después que se arregle el error de migración. Esto indica que la base de datos está "sucio" y necesita ser investigado.

Es necesario determinar si la migración fue aplicado parcialmente o no. Una vez que has determinado esto, la versión de la base de datos debería ser forzado a reflejar su estado verdadero usando el comando force.

$ migrate -path database/migration/ -database "postgresql://username:secretkey@localhost:5432/database_name?sslmode=disable" force <VERSION>

Cómo agregar comandos en un archivo Makefile

migration_up: migrate -path database/migration/ -database "postgresql://username:secretkey@localhost:5432/database_name?sslmode=disable" -verbose up

migration_down: migrate -path database/migration/ -database "postgresql://username:secretkey@localhost:5432/database_name?sslmode=disable" -verbose down

migration_fix: migrate -path database/migration/ -database "postgresql://username:secretkey@localhost:5432/database_name?sslmode=disable" force VERSION

Ahora, puedes ejecutar $ make migration_up para 'up', $ make migration_down para 'down', y $ make migration_fix para arreglar el problema de migración.

Antes de ejecutar el makefile, asegúrate que el número correcto de la versión está incluido en el comando migration_fix.

Conclusión

Los sistemas de migración típicamente generan archivos que pueden ser compartidos entre desarrolladores y múltiples equipos. También pueden ser aplicados a múltiples bases de datos y mantenidos en control de versiones.

Mantener un registro de los cambios a la base de datos hace posible el poder rastrear el historial de modificaciones que se le hicieron. De esta forma, el esquema de la base de datos y el entendimiento de la aplicación de esa estructura pueden evolucionar juntos.

Eso concluye nuestra discusión en migración de base de datos. Espero que la información te haya resultado útil e informativo.

Si disfrutaste leer este artículo, por favor considera compartirlos con tus colegas y con tus amigos en las redes. Adicionalmente, por favor considera seguirme en Twitter para más actualizaciones sobre tecnología y programación. ¡Gracias por leer!