migrate en Go: guía completa con ejemplos prácticos
La librería migrate es una herramienta potente y flexible para gestionar migraciones de bases de datos en el ecosistema Go. Permite a los desarrolladores versionar los cambios en el esquema de la base de datos, aplicar y revertir migraciones de forma automática, e integrarse con diversos sistemas de gestión de bases de datos, incluyendo PostgreSQL, MySQL, SQLite, MongoDB, CockroachDB y más. En este artículo, exploraremos en detalle cómo usar migrate en Go, desde la instalación hasta técnicas avanzadas.
¿Qué es y por qué es necesaria?
Durante el desarrollo de cualquier aplicación que interactúe con una base de datos, tarde o temprano surge la necesidad de modificar la estructura de las tablas: agregar una nueva columna, crear un índice, cambiar un tipo de dato o renombrar una tabla. Si trabajas en equipo o despliegas la aplicación en múltiples entornos (desarrollo, staging, producción), ejecutar scripts SQL manualmente se convierte en una fuente de errores e inconsistencias.
La librería migrate resuelve este problema proporcionando una forma simple y declarativa de describir los cambios en el esquema. Cada migración es un par de archivos: uno para aplicar los cambios (up) y otro para revertirlos (down). La librería lleva un registro de qué migraciones ya se han aplicado, permitiendo avanzar o retroceder de forma segura en el historial de cambios.
Principales ventajas de usar migrate:
- Versionado: cada migración tiene un número único o una marca de tiempo, lo que permite saber exactamente qué versión del esquema se está utilizando.
- Reproducibilidad: puedes reconstruir la base de datos desde cero aplicando todas las migraciones en orden.
- Seguridad: las migraciones down permiten revertir los cambios en caso de error.
- Independencia del lenguaje: las migraciones se escriben en SQL puro, lo que las hace portables entre proyectos en diferentes lenguajes.
Instalación
Para instalar la librería migrate en Go, usa el comando estándar go get. Se recomienda instalarla como dependencia de tu proyecto:
go get -u github.com/golang-migrate/migrate/v4
También necesitarás instalar el driver para tu base de datos. Por ejemplo, para PostgreSQL:
go get -u github.com/golang-migrate/migrate/v4/database/postgres
Para MySQL:
go get -u github.com/golang-migrate/migrate/v4/database/mysql
Para SQLite:
go get -u github.com/golang-migrate/migrate/v4/database/sqlite3
Además, necesitarás un driver para la fuente de migraciones. El más común es el sistema de archivos:
go get -u github.com/golang-migrate/migrate/v4/source/file
También están disponibles drivers para io/fs, github, gitlab, s3 y otras fuentes.
Inicio rápido — ejemplo mínimo funcional
Vamos a crear una aplicación simple que se conecte a una base de datos SQLite y aplique migraciones.
Primero, crea la estructura de carpetas para las migraciones:
mkdir -p migrations
cd migrations
Crea la primera migración. El nombre del archivo debe seguir el patrón: {versión}_{nombre}.{dirección}.sql. La versión suele ser un timestamp o un número secuencial.
Archivo: migrations/000001_create_users_table.up.sql
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Archivo: migrations/000001_create_users_table.down.sql
DR También en la biblioteca
JsonWebToken en JavaScript (Node.js): guía completa con ejemplos
Helmet para JavaScript (Node.js): guía completa con ejemplos
Eloquent ORM para PHP: guía completa con ejemplos
Cliente OAuth para PHP: integración con Google, GitHub y VK
Frameworks CLI para PHP: creación de aplicaciones de consola con Symfony Console y Laravel Zero