SqlAlchemy, l'ORM Python - Partie 2 : Alembic
Mise à jour :
Dans la première partie de ce tutoriel, nous avons vu comment utiliser SqlAlchemy pour manipuler des bases de données relationnelles en Python. Dans cette deuxième partie, nous allons voir comment utiliser Alembic pour gérer les migrations de schéma.
Quand on travaille sur des projets nécessitant des bases de données relationnelles, la gestion des migrations devient rapidement un casse-tête. Vous avez une base en production, vos développeurs ajoutent de nouvelles colonnes, suppriment des tables ou modifient des types de données… et là, tout peut déraper. C’est là qu’Alembic entre en scène.
Alembic, c’est un outil dédié aux migrations de bases de données, pensé pour les développeurs qui utilisent SQLAlchemy. Il permet de gérer les changements de schéma de manière structurée, sans risquer de casser l’existant. En clair, il est là pour vous éviter des nuits blanches en production !
Installation et configuration d’Alembic
Pour commencer avec Alembic, il faut l’installer et s’assurer que votre environnement est prêt à l’utiliser avec une base de données, par exemple SQLite. Voici les étapes à suivre pour une installation simple et rapide.
Avant d’installer Alembic, assurez-vous d’avoir :
- Python (version 3.7 ou supérieure) installé sur votre machine.
- Une base de données SQLite prête à être utilisée (même un fichier vide fera l’affaire).
- L’outil pip pour installer les dépendances Python.
Vous pouvez vérifier ces pré-requis avec les commandes suivantes :
Alembic peut être installé via pip. Exécutez simplement la commande suivante :
Pour vérifier que l’installation a réussi, utilisez la commande suivante pour afficher la version installée :
Si tout est correct, vous verrez un numéro de version (par exemple, 1.10.0
).
Créer un projet avec SQLAlchemy et SQLite
Pour que Alembic soit utile, vous devez avoir un projet utilisant SQLAlchemy avec une base de données. Voici comment créer un environnement minimal avec SQLite :
-
Installer SQLAlchemy : Si ce n’est pas déjà fait, installez SQLAlchemy avec la commande suivante :
-
Créer un fichier de base pour SQLAlchemy : Créez un fichier Python, par exemple
app.py
, avec le code suivant pour initialiser une base SQLite :Ce script crée une base SQLite nommée
example.db
et une table simple nomméeusers
. -
Exécuter le script : Lancez votre script pour vérifier que tout fonctionne correctement :
Après l’exécution, vous devriez voir un fichier
example.db
dans le répertoire courant.
Intégration d’Alembic au projet
Une fois SQLAlchemy installé et fonctionnel, Alembic peut être utilisé pour gérer les migrations de votre base de données. Nous couvrirons cette configuration dans le chapitre suivant, mais pour l’instant, vous êtes prêt à initialiser Alembic dans votre projet.
Cela crée un dossier alembic/
et un fichier alembic.ini
dans votre projet.
Voici ce que contient chaque élément important :
alembic.ini
: le fichier de configuration principal où vous indiquerez les détails de votre base de données.- Dossier
alembic/
:env.py
: le script qui configure les connexions à votre base et contrôle les migrations.versions/
: le répertoire où seront stockés vos scripts de migration.
Configurer la connexion à SQLite
Par défaut, Alembic ne sait pas encore où trouver votre base de données. Il
faut donc modifier le fichier alembic.ini
pour lui indiquer l’URL de connexion
de votre base SQLite.
- Ouvrez le fichier
alembic.ini
. - Localisez la ligne contenant
sqlalchemy.url
et remplacez-la par l’URL de votre base SQLite. Par exemple :
Cela indique à Alembic d’utiliser le fichier example.db
comme base de
données.
Le fichier env.py
est important car il contient la configuration des
migrations et des métadonnées de votre projet. Voici les modifications à
effectuer pour intégrer vos modèles SQLAlchemy.
- Ouvrez
alembic/env.py
. - Localisez la section suivante et modifiez-la pour inclure vos modèles SQLAlchemy :
Avec ces modifications, Alembic sait désormais où trouver vos modèles et peut comparer leurs schémas avec la base de données.
Créer une première migration
Maintenant que Alembic est configuré, vous pouvez créer une première migration pour capturer l’état actuel de vos modèles SQLAlchemy.
- Générez un script de migration avec la commande suivante :
- Cette commande :
- Compare vos modèles SQLAlchemy (via
Base.metadata
) avec la base de données actuelle. - Génère un script de migration dans le répertoire
alembic/versions/
.
- Compare vos modèles SQLAlchemy (via
Le script ressemblera à ceci :
Appliquer la première migration
Pour synchroniser votre base SQLite avec le script de migration, exécutez la commande suivante :
Cette commande applique toutes les migrations disponibles jusqu’à la dernière
version (head
).
Vous pouvez vérifier que la table users
a bien été créée en utilisant un outil
comme sqlite3 ou en écrivant un script Python simple pour interroger la
base.
Vérifier l’historique des migrations
Pour afficher l’historique des migrations appliquées, utilisez la commande suivante :
Cela vous montrera toutes les révisions créées, avec leurs identifiants uniques
(revision
).
Création de nouvelles migrations
Chaque fois que vous modifiez vos modèles SQLAlchemy, vous devez créer une nouvelle migration pour synchroniser ces changements avec votre base de données.
-
Modifier les modèles : Par exemple, ajoutons un nouvel attribut
email
à notre modèleUser
dans le fichierapp.py
: -
Créer une nouvelle révision : Générez un script de migration avec la commande suivante :
Cette commande :
- Compare les métadonnées SQLAlchemy (vos modèles) avec le schéma actuel de la base.
- Génère un fichier de migration dans le dossier
alembic/versions/
.
-
Examiner le script généré : Voici à quoi ressemble le script généré automatiquement dans
alembic/versions/
:Le bloc
upgrade
décrit ce qu’Alembic doit faire pour appliquer la migration, et le blocdowngrade
décrit comment annuler ces changements.
Appliquer les migrations
Après avoir validé le script, appliquez-le à la base de données pour synchroniser le schéma.
-
Appliquer toutes les migrations non exécutées : Utilisez la commande suivante pour appliquer les migrations :
Cette commande met à jour votre base jusqu’à la dernière migration disponible (
head
). -
Vérifier la base de données : Vous pouvez confirmer que la colonne
email
a été ajoutée en utilisant un outil comme sqlite3 ou en interrogeant la base avec SQLAlchemy.
Annuler une migration
Il peut arriver que vous deviez annuler une migration si elle contient une erreur ou si elle n’est plus nécessaire.
-
Revenir à une migration précédente : Pour annuler la dernière migration, utilisez la commande suivante :
Cette commande exécute la fonction
downgrade
de la migration la plus récente. -
Revenir à une version spécifique : Vous pouvez également revenir à une migration particulière en utilisant son identifiant (
revision
) :
Gérer les conflits de migrations
Dans un projet collaboratif, plusieurs développeurs peuvent créer des migrations en parallèle, ce qui peut entraîner des conflits.
-
Conflit courant : Un conflit se produit généralement lorsque deux migrations ont la même
down_revision
. -
Résolution :
- Modifiez manuellement les fichiers de migration pour ajuster les
down_revision
afin de refléter correctement l’ordre des migrations. - Assurez-vous de bien tester les migrations après les avoir fusionnées.
- Modifiez manuellement les fichiers de migration pour ajuster les
Bonnes pratiques pour gérer les migrations
- Toujours utiliser
--autogenerate
: Cela réduit les risques d’erreurs humaines en générant automatiquement les changements. - Examiner chaque script généré : Vérifiez que le script correspond exactement aux changements souhaités.
- Nommer les migrations de manière descriptive : Utilisez des descriptions
claires, comme
"Add email field to users"
. - Synchroniser avec l’équipe : Dans un projet collaboratif, assurez-vous que tous les membres sont à jour avec les migrations avant de travailler sur de nouveaux modèles.
Conclusion
Ce que j’apprécie le plus avec Alembic, c’est sa capacité à évoluer avec vos projets. Au fil du temps, vous verrez que l’adopter, c’est éviter des heures de travail manuel, des erreurs critiques en production, et des conflits interminables entre développeurs.
Alors, lancez-vous ! Testez, migrez, et intégrez Alembic dans vos projets. Une chose est sûre : vos bases de données ne s’en porteront que mieux.