Migraciones de bases de datos en Rust: Resumen de herramientas y bibliotecas
Al desarrollar cualquier aplicación, tarde o temprano surge la necesidad de cambiar la estructura de la base de datos. Agregar nuevas columnas, crear índices o renombrar tablas: todo esto requiere una gestión cuidadosa de las versiones del esquema. En el ecosistema de Rust existen varias soluciones maduras para realizar migraciones. En este artículo, revisaremos los principales enfoques y bibliotecas disponibles para tareas de gestión del esquema de BD.
¿Para qué sirven las migraciones?
Las migraciones permiten:
- Versionar los cambios — cada migración representa un archivo independiente con un número de versión.
- Automatizar el despliegue — aplicar y revertir cambios durante el despliegue.
- Trabajar en equipo — todos los desarrolladores sincronizan el esquema localmente.
- Evitar errores — las migraciones protegen contra cambios accidentales en los datos.
Principales herramientas para migraciones en Rust
1. Diesel Migration (integrado en Diesel ORM)
Diesel es el ORM más popular para Rust. Proporciona un motor de migraciones integrado a través de la utilidad CLI diesel_cli.
Características principales:
- Generación de archivos de migración con consultas SQL.
- Soporte para PostgreSQL, MySQL, SQLite.
- Comandos:
migration generate,migration run,migration redo. - Seguimiento automático de las migraciones aplicadas.
Ejemplo de creación y aplicación de una migración:
# Instalación de CLIcargo install diesel_cli --no-default-features --features postgres
# Creación de una nueva migracióndiesel migration generate create_users
# En la carpeta migrations/ aparecerán dos archivos SQL:# up.sql — código para aplicar# down.sql — código para revertir
# Aplicación de la migracióndiesel migration runContenido de up.sql:
CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT NOW());down.sql:
DROP TABLE IF EXISTS users;2. SQLx migrate (parte del ecosistema SQLx)
SQLx es un controlador asíncrono para bases de datos SQL. Su subsistema de migraciones funciona sin ORM, solo con scripts SQL puros.
Características distintivas:
- Soporte para PostgreSQL, MySQL, SQLite, MSSQL.
- Integración con CLI y ejecución programática desde el código.
- Posibilidad de usar código Rust para verificaciones antes de la migración.
- Verificación automática de integridad (hashes de archivos).
Ejemplo de ejecución programática de migraciones en Rust:
use sqlx::migrate::Migrator;use sqlx::PgPool;
#[tokio::main]async fn main() -> Result<(), sqlx::Error> { let pool = PgPool::connect("postgres://user:pass@localhost/db").await?; // Especificamos la ruta a la carpeta de migraciones let migrator = Migrator::new(std::path::Path::new("./migrations")).await?; // Ejecutamos todas las migraciones pendientes migrator.run(&pool).await?; println!("¡Migraciones ejecutadas con éxito!"); Ok(())}Estructura de la carpeta migrations/:
migrations/├── 20231001_initial.sql├── 20231002_add_email_index.sql└── 20231003_create_roles.sqlCada archivo contiene SQL estándar, por ejemplo:
-- 20231001_initial.sqlCREATE TABLE IF NOT EXISTS users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), username TEXT NOT NULL UNIQUE);3. SeaORM Migrator (parte de SeaORM)
SeaORM es un ORM asíncrono moderno que ofrece su propio sistema de migraciones SeaORM Migrator. Permite escribir migraciones en Rust, en lugar de SQL, lo que