Migrations de bases de données en Rust : Aperçu des outils et bibliothèques
\n\nLors du développement d'une application, il devient tôt ou tard nécessaire de modifier la structure de la base de données. L'ajout de nouvelles colonnes, la création d'index ou le renommage de tables — tout cela nécessite une gestion minutieuse des versions du schéma. Dans l'écosystème Rust, il existe plusieurs solutions matures pour effectuer des migrations. Dans cet article, nous examinerons les principales approches et bibliothèques disponibles pour les tâches de gestion du schéma de base de données.
\n\nPourquoi les migrations sont-elles nécessaires ?
\nLes migrations permettent de :
\n- \n
- Versionner les modifications — chaque migration représente un fichier distinct avec un numéro de version. \n
- Automatiser le déploiement — appliquer et annuler les modifications lors du déploiement. \n
- Travailler en équipe — tous les développeurs synchronisent le schéma localement. \n
- Éviter les erreurs — les migrations protègent contre les modifications accidentelles des données. \n
Principaux outils de migration en Rust
\n\n1. Diesel Migration (intégré à Diesel ORM)
\nDiesel est l'ORM le plus populaire pour Rust. Il fournit un moteur de migration intégré via l'utilitaire CLI diesel_cli.
Fonctionnalités principales :
\n- \n
- Génération de fichiers de migration avec des requêtes SQL. \n
- Prise en charge de PostgreSQL, MySQL, SQLite. \n
- Commandes :
migration generate,migration run,migration redo. \n - Suivi automatique des migrations appliquées. \n
Exemple de création et d'application d'une migration :
\n# Installation de CLI\ncargo install diesel_cli --no-default-features --features postgres\n\n# Création d'une nouvelle migration\ndiesel migration generate create_users\n\n# Dans le dossier migrations/, deux fichiers SQL apparaîtront :\n# up.sql — code pour l'application\n# down.sql — code pour l'annulation\n\n# Application de la migration\ndiesel migration run\nContenu de up.sql :
CREATE TABLE users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n email VARCHAR(255) UNIQUE NOT NULL,\n created_at TIMESTAMP DEFAULT NOW()\n);\ndown.sql :
DROP TABLE IF EXISTS users;\n\n2. SQLx migrate (partie de l'écosystème SQLx)
\nSQLx est un pilote asynchrone pour les bases de données SQL. Son sous-système de migration fonctionne sans ORM, uniquement avec des scripts SQL purs.
\nCaractéristiques distinctives :
\n- \n
- Prise en charge de PostgreSQL, MySQL, SQLite, MSSQL. \n
- Intégration avec CLI et exécution programmatique depuis le code. \n
- Possibilité d'utiliser du code Rust pour des vérifications avant la migration. \n
- Vérification automatique de l'intégrité (hachage des fichiers). \n
Exemple d'exécution programmatique de migrations en Rust :
\nuse sqlx::migrate::Migrator;\nuse sqlx::PgPool;\n\n#[tokio::main]\nasync fn main() -> Result<(), sqlx::Error> {\n let pool = PgPool::connect("postgres://user:pass@localhost/db").await?;\n \n // Spécifie le chemin vers le dossier des migrations\n let migrator = Migrator::new(std::path::Path::new("./migrations")).await?;\n \n // Exécute toutes les migrations non appliquées\n migrator.run(&pool).await?;\n \n println!("Migrations exécutées avec succès !");\n Ok(())\n}\nStructure du dossier migrations/ :
migrations/\n├── 20231001_initial.sql\n├── 20231002_add_email_index.sql\n└── 20231003_create_roles.sql\nChaque fichier contient du SQL standard, par exemple :
\n-- 20231001_initial.sql\nCREATE TABLE IF NOT EXISTS users (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n username TEXT NOT NULL UNIQUE\n);\n\n3. SeaORM Migrator (partie de SeaORM)
\nSeaORM est un ORM asynchrone moderne qui propose son propre système de migration SeaORM Migrator. Il permet d'écrire des migrations en Rust plutôt qu'en SQL, ce qui d