Migraciones con golang-migrate y goose
Los cambios de esquema pertenecen a archivos de migración versionados, no a ALTER ad hoc al iniciar la aplicación.
Busca en todas las páginas de la documentación
Los cambios de esquema pertenecen a archivos de migración versionados, no a ALTER ad hoc al iniciar la aplicación.
golang-migrate y goose son herramientas populares compatibles con Go que aplican migraciones SQL (o Go) ordenadas y soportan reversiones en pipelines de CI y despliegue.
Las migraciones son archivos con marca de tiempo o secuenciados con secciones up y down.
Aplica migraciones antes de que el nuevo código sirva tráfico, o usa patrones expandir-contraer para despliegues con cero tiempo de inactividad.
Ejecuta trabajos de migración en CI contra bases de datos efímeras para detectar errores SQL temprano.
Nunca ejecutes migraciones dentro de manejadores HTTP por solicitud.
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
# CLI de golang-migrate
migrate -path ./migrations -database "${DATABASE_URL}" up
migrate -path ./migrations -database "${DATABASE_URL}" down 1
# CLI de goose
goose -dir ./migrations postgres "$DATABASE_URL" up
goose -dir ./migrations postgres "$DATABASE_URL" down// Incrustar migraciones (ver artículo hermano)
//go:embed migrations/*.sql
var migrationFS embed.FSCuándo usar esto:
down restauran la forma anterior en staging.package main
import (
"database/sql"
"fmt"
"log"
"github.com/pressly/goose/v3"
_ "github.com/jackc/pgx/v5/stdlib"
)
func main() {
db, err := sql.Open("pgx", "postgres://localhost:5432/app?sslmode=disable")
if err != nil {
log.Fatal(err)
}
defer db.Close()
goose.SetDialect("postgres")
if err := goose.Up(db, "migrations"); err != nil {
log.Fatal(err)
}
fmt.Println("migraciones aplicadas")
}Ejemplo migrations/00001_create_users.sql:
-- +goose Up
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email TEXT NOT NULL UNIQUE
);
-- +goose Down
DROP TABLE users;Lo que esto demuestra:
goose.Up aplica archivos pendientes en orden léxico.SetDialect selecciona las peculiaridades de SQL para Postgres, MySQL o SQLite.schema_migrations o tabla de versiones de goose).up ejecuta archivos pendientes; down revierte los últimos N pasos.000001_init.up.sql y 000001_init.down.sql.| Paso | Propietario | Acción |
|---|---|---|
| PR | Desarrollador | Añadir migración + código de aplicación en el mismo PR |
| CI | Pipeline | Iniciar DB efímera, up, ejecutar pruebas, down opcional |
| Staging | Lanzamiento | up antes de desplegar pods |
| Producción | Lanzamiento | up con instantánea de respaldo; monitorizar bloqueos |
Los cambios destructivos (NOT NULL sin valor predeterminado, renombrar en el lugar) requieren lanzamientos multifase.
| Herramienta | Fortaleza | Compromiso |
|---|---|---|
| golang-migrate | Ampliamente utilizado, CLI + biblioteca | Las migraciones de Go necesitan un diseño de paquete separado |
| goose | Migraciones de Go en el mismo módulo | El equipo debe acordar el formato de anotación |
| GORM AutoMigrate | Prototipos rápidos | Mala historia de revisión para el esquema de producción |
down faltante - Los simulacros de reversión fallan. Solución: requerir down en la revisión para cambios reversibles; documentar operaciones irreversibles.ALTER. Solución: ejecutar migraciones pesadas como un trabajo de mantenimiento separado con monitorización de bloqueos.up antes de las pruebas.down destructivo en producción - Pérdida de datos en la reversión. Solución: tratar down solo para staging; las reversiones de producción restauran copias de seguridad.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Flyway/Liquibase (JVM) | Estándar políglota de la organización | Tienda puramente Go que quiere migraciones incrustadas |
| GORM AutoMigrate | Esquema de hackathon | Esquema de producción auditado |
| Runbooks manuales de DBA | Mainframes tocados raramente | Equipos de producto que se mueven rápido |
| sqlc sin migraciones | Solo consultas | Todavía necesitas versionado de esquema en algún lugar |
| Atlas / skeema | Estado deseado declarativo | El equipo prefiere archivos up/down imperativos |
La incrustación de la biblioteca más Up al arrancar es aceptable para servicios pequeños.
Equipos más grandes prefieren un Trabajo de Kubernetes o un hook de lanzamiento para que los pods de la aplicación comiencen solo después de que el esquema esté listo.
Usa secuencias con ceros a la izquierda o marcas de tiempo UTC; nunca reutilices números.
Un cambio lógico por archivo facilita la revisión.
Elige una herramienta por repositorio para evitar tablas de versiones en competencia.
Migrar herramientas es un proyecto único con una ventana de congelación.
Scripts de semilla separados o migraciones Go de goose para fixtures de desarrollo.
Las semillas de producción pertenecen a trabajos idempotentes, no a SQL aleatorio en up.
A menudo, corrección hacia adelante con una nueva migración en lugar de down.
down es más valioso en CI y en las laptops de los desarrolladores.
La CLI y los trabajos pueden usar context.Background() con cancelación controlada por operaciones.
No vincules los cambios de esquema al contexto de la solicitud HTTP.
CI: up, pruebas de integración, down, up de nuevo para detectar scripts no idempotentes.
Cuenta las instantáneas de filas para migraciones de datos.
Rol capaz de DDL utilizado solo en el trabajo de despliegue; el tiempo de ejecución de la aplicación usa privilegios menores.
Usuarios separados reducen el radio de explosión.
Ver embed para Migraciones SQL y Datos de Semilla para empaquetar archivos dentro del binario.
Útil para backfills complejos con registro y lotes.
Mantén el DDL simple en SQL para que los DBA puedan revisarlo.
Versiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado Green Tea GC, go fix modernizers - verificar parche en la compilación), chi (última versión - verificar en la compilación), gin (última versión - verificar en la compilación), echo (última versión - verificar en la compilación), google.golang.org/grpc (última versión - verificar en la compilación), sigs.k8s.io/controller-runtime (última versión - verificar en la compilación), kubebuilder (última versión - verificar en la compilación), tinygo (última versión - verificar objetivos de placa en la compilación), wazero (última versión - verificar en la compilación), y golangci-lint (última versión - verificar conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 19 jul 2026