Migraciones de bases de datos en Go (Golang): cómo gestionar el esquema de datos
Al desarrollar aplicaciones en Go, tarde o temprano surge la necesidad de modificar la estructura de la base de datos: agregar nuevas tablas, cambiar columnas existentes, crear índices. La ejecución manual de scripts SQL en diferentes entornos (entorno de desarrollo local, staging, producción) provoca errores y desincronización. La solución son las migraciones de bases de datos (database migrations).
En el ecosistema de Go existen varias bibliotecas maduras para gestionar migraciones. En este artículo analizaremos en detalle las tres herramientas más populares: golang-migrate/migrate, pressly/goose y rubenv/sql-migrate. Aprenderá cómo instalar, configurar y usar cada una de ellas, además de conocer las mejores prácticas.
¿Qué son las migraciones y por qué son necesarias?
Una migración es un archivo (o conjunto de archivos) que contiene comandos SQL para modificar el esquema de la base de datos. Cada migración tiene un identificador único (generalmente una marca de tiempo o un número) y dos direcciones: up (aplicar cambios) y down (revertir cambios).
Principales ventajas de usar migraciones:
- Versionado del esquema — el historial de cambios se almacena en el repositorio junto con el código.
- Reproducibilidad — los mismos cambios en todos los entornos.
- Reversión de cambios — posibilidad de volver rápidamente a una versión anterior del esquema.
- Trabajo en equipo — los desarrolladores no sobrescriben los cambios de los demás.
1. golang-migrate/migrate
La biblioteca más popular para migraciones en Go. Soporta PostgreSQL, MySQL, SQLite, MongoDB y muchas otras bases de datos.
Instalación
go get -u github.com/golang-migrate/migrate/v4go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latestEstructura de las migraciones
Cree una carpeta migrations y agregue archivos con el prefijo en el formato {timestamp}_{title}.{direction}.sql:
migrations/ 000001_create_users_table.up.sql 000001_create_users_table.down.sql 000002_add_email_column.up.sql 000002_add_email_column.down.sqlEjemplo de migración (up)
-- 000001_create_users_table.up.sqlCREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT NOW());Ejemplo de migración (down)
-- 000001_create_users_table.down.sqlDROP TABLE IF EXISTS users;Aplicar migraciones desde código Go
package main
import ( "github.com/golang-migrate/migrate/v4" _ "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/source/file")
func main() { m, err := migrate.New( "file://migrations", "postgres://localhost:5432/mydb?sslmode=disable") if err != nil { panic(err) } if err := m.Up(); err != nil && err != migrate.ErrNoChange { panic(err) }}2. pressly/goose
Goose es una herramienta ligera y rápida que también permite escribir migraciones en Go (no solo en SQL). Es ideal para proyectos que requieren lógica del lado del código.
Instalación
go get github.com/pressly/goose/v3/cmd/gooseCrear una migración
goose create create_users_table sqlSe creará un archivo con el formato 20250101120000_create_users_table.sql. Contenido:
-- +goose UpCREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL);
-- +goose DownDROP TABLE IF EXISTS users;Migraciones en Go (opción avanzada)
Goose permite escribir migrac
También en la biblioteca
Configuración de aplicaciones en Go: mejores prácticas y herramientas
Autorización y autenticación en C++: bibliotecas e implementación
Symfony para PHP: guía completa con ejemplos
Generación de Swagger/OpenAPI para Swift: herramientas y bibliotecas
Trabajo con Kafka en Java: bibliotecas, configuración y ejemplos de código