Migrations de bases de données en Rust : aperçu des outils Diesel, SeaORM et sqlx
La gestion des modifications du schéma de base de données est l'une des tâches clés dans le développement de toute application web. Dans l'écosystème Rust, plusieurs outils matures existent à cet effet. Dans cet article, nous examinerons trois approches principales des migrations : Diesel, SeaORM et sqlx. Chacun propose sa propre approche unique de la gestion des versions du schéma de base de données, et le choix du bon outil peut avoir un impact significatif sur l'architecture du projet.
1. Diesel — ORM classique avec intégration des migrations
Diesel est un ORM et Query Builder sûr et extensible pour Rust, étroitement intégré au système de migrations. Son principal avantage est la vérification des types au moment de la compilation : les structures de tableaux sont générées à partir du schéma de la base de données, ce qui élimine les erreurs d'incompatibilité de types.
Les migrations dans Diesel sont de simples fichiers SQL, organisés dans le répertoire migrations/. Chaque migration contient deux fichiers : up.sql (application des modifications) et down.sql (annulation).
Exemple de structure de migration pour créer une table d'utilisateurs :
-- 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;Pour exécuter les migrations, on utilise l'outil CLI diesel_cli :
# Installationcargo install diesel_cli --no-default-features --features postgres
# Exécution des migrationsdiesel migration run
# Annulation de la dernière migrationdiesel migration revert
# Génération d'une nouvelle migrationdiesel migration generate create_usersAvantages de Diesel :
- Vérification complète des types au moment de la compilation
- Structure de migration simple et claire (SQL pur)
- Prise en charge intégrée des annulations
- Excellentes performances
Inconvénients :
- Nécessite l'installation d'un outil CLI supplémentaire
- Configuration complexe pour les projets avec plusieurs bases de données
- Moins de flexibilité par rapport à sqlx
2. SeaORM — ORM asynchrone avec un système de migration flexible
SeaORM (basé sur sea-query et sqlx) est un ORM asynchrone qui propose une approche plus moderne des migrations. Contrairement à Diesel, les migrations dans SeaORM sont écrites en Rust, et non en SQL, ce qui permet d'utiliser toute la puissance du langage pour décrire les modifications du schéma.
Exemple de migration avec 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(), ) Aussi dans la bibliothèque
Files d'attente de tâches pour Rust : Aperçu des bibliothèques et outils populaires
Envoi d'Email en C++ : bibliothèques et implémentation
Bull pour JavaScript (Node.js) : guide complet avec exemples
Internationalisation (i18n) en Kotlin : guide complet