Migraciones de bases de datos en Go (Golang): guía completa de herramientas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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@latest


Estructura 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.sql


Ejemplo 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/goose


Crear una migración

goose create create_users_table sql


Se 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

Recommendations