Migrations de bases de données en Rust : Aperçu des outils et bibliothèques

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Migrations de bases de données en Rust : Aperçu des outils et bibliothèques

\n\n

Lors 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\n

Pourquoi les migrations sont-elles nécessaires ?

\n

Les 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
\n\n

Principaux outils de migration en Rust

\n\n

1. Diesel Migration (intégré à Diesel ORM)

\n

Diesel est l'ORM le plus populaire pour Rust. Il fournit un moteur de migration intégré via l'utilitaire CLI diesel_cli.

\n

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
\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
\n

Contenu de up.sql :

\n
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);
\n

down.sql :

\n
DROP TABLE IF EXISTS users;
\n\n

2. SQLx migrate (partie de l'écosystème SQLx)

\n

SQLx 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.

\n

Caracté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
\n

Exemple d'exécution programmatique de migrations en Rust :

\n
use 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}
\n

Structure du dossier migrations/ :

\n
migrations/\n├── 20231001_initial.sql\n├── 20231002_add_email_index.sql\n└── 20231003_create_roles.sql
\n

Chaque 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\n

3. SeaORM Migrator (partie de SeaORM)

\n

SeaORM 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

Recommendations