Migraciones de bases de datos en Go: revisión de herramientas y prácticas

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): guía completa



Al desarrollar aplicaciones web en Go, tarde o temprano surge la necesidad de modificar la estructura de la base de datos: agregar nuevas tablas, cambiar columnas existentes o crear índices. La ejecución manual de scripts SQL en diferentes entornos (desarrollo, staging, producción) provoca errores y desincronización. La solución a este problema son las migraciones de bases de datos.



En Go existen varias bibliotecas maduras para gestionar migraciones. En este artículo analizaremos en detalle las dos más populares: golang-migrate/migrate y pressly/goose, y proporcionaremos ejemplos de su uso.



¿Qué son las migraciones y por qué son necesarias?



Una migración es un conjunto versionado de comandos SQL (o código Go) que se aplica a la base de datos de forma secuencial. Cada migración tiene un identificador único (generalmente una marca de tiempo o un número) y puede ser aplicada (up) o revertida (down).



Principales ventajas:

  • Automatización de cambios en el esquema de la BD
  • Reproducibilidad: mismo resultado en cualquier entorno
  • Posibilidad de revertir cambios
  • Almacenamiento del historial de cambios en el código (compatible con VCS)


1. Biblioteca golang-migrate/migrate



Es la biblioteca más popular para migraciones en Go. Soporta PostgreSQL, MySQL, SQLite, MongoDB y otros sistemas de gestión de bases de datos. Las migraciones pueden escribirse tanto en SQL puro como en Go.



Instalación

go get -u github.com/golang-migrate/migrate/v4


Estructura de los archivos de migración

Los archivos se colocan en la carpeta migrations/ y se nombran según la plantilla:

{timestamp}_{title}.up.sql{timestamp}_{title}.down.sql

Ejemplo:

migrations/  000001_create_users_table.up.sql  000001_create_users_table.down.sql  000002_add_email_to_users.up.sql  000002_add_email_to_users.down.sql


Ejemplo de migración SQL

Archivo 000001_create_users_table.up.sql:

CREATE TABLE IF NOT EXISTS users (    id SERIAL PRIMARY KEY,    name VARCHAR(255) NOT NULL,    created_at TIMESTAMP DEFAULT NOW());

Archivo 000001_create_users_table.down.sql:

DROP TABLE IF EXISTS users;


Aplicación de 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://user:password@localhost:5432/dbname?sslmode=disable", ) if err != nil { panic(err) }

// Aplicar todas las migraciones disponibles (Up) if err := m.Up(); err != nil && err != migrate.ErrNoChange { panic(err) }

// Revertir la última migración (Down) // if err := m.Steps(-1); err != nil { // panic(err) // }}


Herramienta CLI migrate

También está disponible una utilidad de línea de comandos:

migrate create -ext sql -dir migrations -seq create_users_tablemigrate -path migrations -database "postgres://..." upmigrate -path migrations -database "postgres://..." down 1


2. Biblioteca pressly/goose



Goose es otra herramienta popular, creada originalmente como análogo de las migraciones de ActiveRecord de Ruby on Rails. Soporta migraciones SQL y Go, además de un CLI integrado.



Instalación

go get -u github.com/pressly/goose/v3


Estructura de archivos

Los archivos se nombran como {timestamp}_{title}.sql (sin separación en up/down, todo en un mismo archivo mediante comentarios):

migrations/  20240101120000_create_users_table.sql  20240102150000_add_email_to_users.sql


Ejemplo de migr

Recommendations