Las migraciones de base de datos son una parte crucial del desarrollo de aplicaciones, ya que permiten gestionar los cambios en la estructura de la base de datos de manera controlada y reproducible. En este tema, aprenderemos cómo realizar migraciones de base de datos en Go utilizando herramientas populares.

Objetivos de Aprendizaje

Al final de este tema, deberías ser capaz de:

  1. Comprender el concepto de migraciones de base de datos.
  2. Configurar una herramienta de migraciones en un proyecto Go.
  3. Crear y aplicar migraciones de base de datos.
  4. Revertir migraciones en caso de errores.

Conceptos Clave

¿Qué son las Migraciones de Base de Datos?

Las migraciones de base de datos son scripts que permiten modificar la estructura de la base de datos (como crear, modificar o eliminar tablas y columnas) de manera incremental. Esto es especialmente útil en entornos de desarrollo colaborativo y despliegue continuo.

Herramientas de Migración

Existen varias herramientas para gestionar migraciones en Go. Algunas de las más populares son:

  • golang-migrate: Una herramienta flexible y ampliamente utilizada.
  • goose: Otra opción popular que es fácil de usar.

En este tema, nos centraremos en golang-migrate.

Configuración de golang-migrate

Instalación

Primero, necesitamos instalar la herramienta golang-migrate. Puedes hacerlo utilizando go get:

go get -u -d github.com/golang-migrate/migrate/cmd/migrate

Configuración del Proyecto

Asegúrate de tener una estructura de proyecto similar a la siguiente:

my-go-project/
├── main.go
├── db/
│   ├── migrations/
│   └── db.go
└── go.mod

Archivo de Configuración de la Base de Datos

Crea un archivo db/db.go para manejar la conexión a la base de datos:

package db

import (
    "database/sql"
    _ "github.com/lib/pq" // Importa el driver de PostgreSQL
    "log"
)

var DB *sql.DB

func InitDB(dataSourceName string) {
    var err error
    DB, err = sql.Open("postgres", dataSourceName)
    if err != nil {
        log.Fatal(err)
    }

    if err = DB.Ping(); err != nil {
        log.Fatal(err)
    }
}

Creación de Migraciones

Crear una Nueva Migración

Para crear una nueva migración, usa el comando migrate create:

migrate create -ext sql -dir db/migrations -seq create_users_table

Esto creará dos archivos en el directorio db/migrations:

  • 000001_create_users_table.up.sql
  • 000001_create_users_table.down.sql

Escribir la Migración

Edita el archivo 000001_create_users_table.up.sql para definir la estructura de la nueva tabla:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

Y el archivo 000001_create_users_table.down.sql para revertir la migración:

DROP TABLE users;

Aplicar Migraciones

Ejecutar Migraciones

Para aplicar las migraciones, usa el comando migrate up:

migrate -path db/migrations -database "postgres://user:password@localhost:5432/mydb?sslmode=disable" up

Revertir Migraciones

Si necesitas revertir una migración, usa el comando migrate down:

migrate -path db/migrations -database "postgres://user:password@localhost:5432/mydb?sslmode=disable" down

Ejercicio Práctico

Ejercicio

  1. Crea una nueva migración para añadir una columna last_login a la tabla users.
  2. Escribe los scripts SQL para la migración y la reversión.
  3. Aplica la migración y verifica que la columna ha sido añadida.
  4. Revertir la migración y verifica que la columna ha sido eliminada.

Solución

  1. Crear la migración:
migrate create -ext sql -dir db/migrations -seq add_last_login_to_users
  1. Editar 000002_add_last_login_to_users.up.sql:
ALTER TABLE users ADD COLUMN last_login TIMESTAMP WITH TIME ZONE;
  1. Editar 000002_add_last_login_to_users.down.sql:
ALTER TABLE users DROP COLUMN last_login;
  1. Aplicar la migración:
migrate -path db/migrations -database "postgres://user:password@localhost:5432/mydb?sslmode=disable" up
  1. Revertir la migración:
migrate -path db/migrations -database "postgres://user:password@localhost:5432/mydb?sslmode=disable" down

Conclusión

En este tema, hemos aprendido sobre la importancia de las migraciones de base de datos y cómo utilizarlas en un proyecto Go utilizando golang-migrate. Ahora deberías ser capaz de crear, aplicar y revertir migraciones de base de datos, lo que te permitirá gestionar cambios en la estructura de tu base de datos de manera eficiente y controlada.

© Copyright 2024. Todos los derechos reservados