Migrations de bases de données en Java : pourquoi et comment ça fonctionne
Le développement de toute application sérieuse en Java est inextricablement lié à l'évolution du schéma de la base de données. Ajout de nouveaux champs, modification des types de données, création d'index — tout cela est inévitable au cours du développement du projet. L'exécution manuelle de scripts SQL sur différents environnements (environnement de développement local, banc d'essai, production) mène rapidement au chaos : les scripts se perdent, sont exécutés dans le mauvais ordre, et la base de données d'une équipe diffère de celle d'une autre. La solution à ce problème — les migrations de bases de données (database migrations).
Les migrations permettent de versionner les modifications du schéma, de les appliquer automatiquement dans le bon ordre et de les annuler si nécessaire. Dans le monde Java, il existe deux leaders incontestés dans ce domaine : Flyway et Liquibase. Examinons-les plus en détail.
Flyway : simplicité et fiabilité
Flyway est un outil de migration léger, simple et puissant. Sa philosophie : « Les migrations sont simplement du SQL ou des classes Java ». Les principes de fonctionnement de base :
- Versionnage : chaque fichier de migration possède un numéro de version unique (par exemple,
V1__create_users.sql,V2__add_email.sql). - Ordre d'exécution : Flyway suit les migrations appliquées dans une table spéciale (
flyway_schema_history) et n'applique que les nouvelles. - Deux types de migrations : scripts SQL et migrations Java (pour une logique complexe).
- Annulation : les migrations « undo » sont prises en charge (dans la version payante) ou l'écriture manuelle de scripts d'annulation.
Exemple d'utilisation de Flyway
Supposons que vous deviez créer une table d'utilisateurs. Vous créez le fichier db/migration/V1__create_users.sql :
CREATE TABLE users ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);Ensuite, vous ajoutez une deuxième migration V2__add_age.sql :
ALTER TABLE users ADD COLUMN age INT;La connexion de Flyway à une application Spring Boot se fait via application.properties :
spring.flyway.enabled=truespring.flyway.locations=classpath:db/migrationspring.datasource.url=jdbc:postgresql://localhost:5432/mydbspring.datasource.username=userspring.datasource.password=passAu démarrage de l'application, Flyway vérifiera automatiquement la table d'historique et appliquera toutes les nouvelles migrations. Si une migration a déjà été exécutée, elle sera ignorée.
Liquibase : flexibilité et contrôle
Liquibase est un outil plus flexible et plus puissant qui prend en charge plusieurs formats de description des modifications : XML, YAML, JSON et SQL. Sa caractéristique clé est les changesets (ensembles de modifications).
- Identifiant unique : chaque changeset possède un
idet unauthor. - Génération automatique de SQL : Liquibase peut générer du SQL pour un SGBD spécifique (PostgreSQL, MySQL, Oracle, etc.).
- Contextes : vous pouvez séparer les migrations pour différents environnements (dev, test, prod).
- Annulation : chaque changeset peut avoir une instruction d'annulation (
rollback).
Exemple d'utilisation de Liquibase
Exemple de changeset au format XML (db/changelog/db.changelog-master.xml) :
<?xml version="1.0" encoding="UTF-8"?><databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.9.xsd">
<changeSet id="1" author="pythonlib"> <