Migraciones de bases de datos en Rust: revisión de herramientas Diesel, SeaORM y sqlx

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 Rust: revisión de herramientas Diesel, SeaORM y sqlx

La gestión de cambios en el esquema de la base de datos es una de las tareas clave en el desarrollo de cualquier aplicación web. En el ecosistema de Rust, existen varias herramientas maduras para este propósito. En este artículo, revisaremos tres enfoques principales para las migraciones: Diesel, SeaORM y sqlx. Cada uno ofrece su propio enfoque único para la gestión de versiones del esquema de BD, y la elección de la herramienta correcta puede influir significativamente en la arquitectura del proyecto.



1. Diesel — ORM clásico con integración de migraciones

Diesel es un ORM y Query Builder seguro y extensible para Rust, que está estrechamente integrado con el sistema de migraciones. Su principal ventaja es la verificación de tipos en tiempo de compilación: las estructuras de las tablas se generan basándose en el esquema de la BD, lo que elimina errores de discrepancia de tipos.



Las migraciones en Diesel son archivos SQL comunes, organizados en el directorio migrations/. Cada migración contiene dos archivos: up.sql (aplicar cambios) y down.sql (revertir).



Ejemplo de estructura de migración para crear una tabla de usuarios:



-- migrations/2024-01-15-120000_create_users/up.sqlCREATE TABLE users (    id SERIAL PRIMARY KEY,    username VARCHAR(255) NOT NULL UNIQUE,    email VARCHAR(255) NOT NULL UNIQUE,    created_at TIMESTAMP NOT NULL DEFAULT NOW());

-- migrations/2024-01-15-120000_create_users/down.sqlDROP TABLE IF EXISTS users;


Para ejecutar las migraciones se utiliza la herramienta CLI diesel_cli:



# Instalacióncargo install diesel_cli --no-default-features --features postgres

# Ejecutar migracionesdiesel migration run

# Revertir la última migracióndiesel migration revert

# Generar una nueva migracióndiesel migration generate create_users


Ventajas de Diesel:

  • Verificación completa de tipos en tiempo de compilación
  • Estructura de migraciones simple y clara (SQL puro)
  • Soporte integrado para reversiones
  • Excelente rendimiento


Desventajas:

  • Requiere la instalación de una herramienta CLI adicional
  • Configuración compleja para proyectos con múltiples bases de datos
  • Menor flexibilidad en comparación con sqlx


2. SeaORM — ORM asíncrono con sistema de migraciones flexible

SeaORM (basado en sea-query y sqlx) es un ORM asíncrono que ofrece un enfoque más moderno para las migraciones. A diferencia de Diesel, las migraciones en SeaORM se escriben en Rust, no en SQL, lo que permite utilizar toda la potencia del lenguaje para describir los cambios en el esquema.



Ejemplo de migración usando SeaORM:



use sea_orm_migration::prelude::*;

#[derive(DeriveMigrationName)]pub struct Migration;

#[async_trait::async_trait]impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { manager .create_table( Table::create() .table(Users::Table) .if_not_exists() .col( ColumnDef::new(Users::Id) .integer() .not_null() .auto_increment() .primary_key(), ) .col(ColumnDef::new(Users::Username).string().not_null()) .col(ColumnDef::new(Users::Email).string().not_null()) .col( ColumnDef::new(Users::CreatedAt) .timestamp() .default(Expr::current_timestamp()), ) .to_owned(), )

Recommendations