Utilisez Liquibase pour faire évoluer en toute sécurité votre schéma de base de données

1. Vue d'ensemble

Dans ce rapide tutoriel, nous utiliserons Liquibase pour faire évoluer le schéma de base de données d'une application Web Java.

Nous allons d'abord nous concentrer sur une application Java générale, et nous allons également examiner de manière ciblée certaines options intéressantes disponibles pour Spring et Hibernate.

Très brièvement, le cœur de l'utilisation de Liquibase est le fichier changeLog - un fichier XML qui garde une trace de toutes les modifications qui doivent être exécutées pour mettre à jour la base de données.

Commençons par la dépendance Maven que nous devons ajouter dans notre pom.xml :

 org.liquibase liquibase-core 3.4.1 

Vous pouvez également vérifier s'il existe une version plus récente de liquibase-core ici.

2. Le journal des modifications de la base de données

Maintenant, jetons un coup d'œil à un simple fichier changeLog - celui-ci ajoute seulement une colonne « adresse » à la table « utilisateurs »:

Notez comment l'ensemble de modifications est identifié par un identifiant et un auteur - pour vous assurer qu'il peut être identifié de manière unique et appliqué une seule fois.

Ne voyons pas comment câbler cela dans notre application et assurez-vous qu'il s'exécute au démarrage de l'application.

3. Exécutez Liquibase avec un haricot de printemps

Notre première option pour exécuter les modifications au démarrage de l'application est via un bean Spring. Il existe bien sûr de nombreuses autres façons, mais si nous avons affaire à une application Spring, c'est une bonne et simple façon de procéder:

@Bean public SpringLiquibase liquibase() { SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setChangeLog("classpath:liquibase-changeLog.xml"); liquibase.setDataSource(dataSource()); return liquibase; }

Notez comment nous le pointons vers un fichier changeLog valide qui doit exister sur le chemin de classe .

4. Utilisez Liquibase avec Spring Boot

Si vous utilisez Spring Boot, il n'est pas nécessaire de définir un Bean pour Liquibase.

Tout ce dont vous avez besoin est de mettre votre journal des modifications dans « db / changelog / db.changelog-master.yaml » et les migrations Liquibase s'exécuteront automatiquement au démarrage.

Notez que:

  • Vous devez ajouter une dépendance « liquibase-core ».
  • Vous pouvez modifier le fichier journal des modifications par défaut à l'aide de la propriété « liquibase.change-log » - par exemple:
liquibase.change-log=classpath:liquibase-changeLog.xml

5. Désactivez Liquibase dans Spring Boot

Parfois, nous pouvons avoir besoin de désactiver l'exécution de la migration Liquibase au démarrage.

L'option la plus simple dont nous disposons est d'utiliser une propriété spring.liquibase.enabled . De cette façon, toute la configuration restante de Liquibase reste intacte.

Voici l'exemple pour Spring Boot 2:

spring.liquibase.enabled=false

Pour Spring Boot 1.x, nous devons utiliser une propriété liquibase.enabled :

liquibase.enabled=false

6. Générez le changeLog avec un plugin Maven

Au lieu d'écrire le fichier changeLog manuellement, nous pouvons utiliser le plugin Liquibase Maven pour en générer un et nous épargner beaucoup de travail.

6.1. Configuration du plugin

Voici les modifications apportées à notre pom.xml :

 org.liquibase liquibase-maven-plugin 3.4.1  ...   org.liquibase liquibase-maven-plugin 3.4.1  src/main/resources/liquibase.properties   

6.2. Générer un ChangeLog à partir d'une base de données existante

Nous pouvons utiliser le plugin pour générer un journal des modifications à partir d'une base de données existante:

mvn liquibase:generateChangeLog

Voici les propriétés de la liquibase :

url=jdbc:mysql://localhost:3306/oauth_reddit username=tutorialuser password=tutorialmy5ql driver=com.mysql.jdbc.Driver outputChangeLogFile=src/main/resources/liquibase-outputChangeLog.xml

Le résultat final est un fichier changeLog que nous pouvons utiliser soit pour créer un schéma de base de données initial, soit pour remplir des données. Voici à quoi cela ressemblerait pour notre exemple d'application:

                     ... 

6.3. Générer un ChangeLog à partir d'une différence entre deux bases de données

Nous pouvons utiliser le plugin pour générer un fichier changeLog à partir des différences entre deux bases de données existantes (par exemple: développement et production):

mvn liquibase:diff

Voici les propriétés:

changeLogFile=src/main/resources/liquibase-changeLog.xml url=jdbc:mysql://localhost:3306/oauth_reddit username=tutorialuser password=tutorialmy5ql driver=com.mysql.jdbc.Driver referenceUrl=jdbc:h2:mem:oauth_reddit diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml referenceDriver=org.h2.Driver referenceUsername=sa referencePassword=

Et voici un extrait du changeLog généré :

C'est un moyen très puissant de faire évoluer votre base de données, par exemple, en permettant à Hibernate de générer automatiquement un nouveau schéma pour le développement, puis en l'utilisant comme point de référence par rapport à l'ancien schéma.

7. Utilisez le plug-in Liquibase Hibernate

Si l'application utilise Hibernate - nous allons jeter un oeil à un moyen très utile de générer le changeLog .

Tout d'abord - voici comment le plugin liquibase-hibernate doit être configuré dans Maven:

7.1. Configuration du plugin

Tout d'abord, configurons le nouveau plugin et utilisons les bonnes dépendances:

  org.liquibase liquibase-maven-plugin 3.4.1  src/main/resources/liquibase.properties    org.liquibase.ext liquibase-hibernate4 3.5   org.springframework spring-beans 4.1.7.RELEASE   org.springframework.data spring-data-jpa 1.7.3.RELEASE    

7.2. Générer un changeLog à partir des différences entre une base de données et des entités de persistance

Maintenant, pour la partie amusante. Nous pouvons utiliser ce plugin pour générer un fichier changeLog à partir des différences entre une base de données existante (par exemple production) et nos nouvelles entités de persistance.

Donc, pour simplifier les choses, une fois qu'une entité est modifiée, vous pouvez simplement générer les modifications par rapport à l'ancien schéma de base de données, obtenant ainsi un moyen propre et puissant de faire évoluer votre schéma en production .

Voici les propriétés de la liquibase:

changeLogFile=classpath:liquibase-changeLog.xml url=jdbc:mysql://localhost:3306/oauth_reddit username=tutorialuser password=tutorialmy5ql driver=com.mysql.jdbc.Driver referenceUrl=hibernate:spring:org.baeldung.persistence.model ?dialect=org.hibernate.dialect.MySQLDialect diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml

Remarque: La référenceUrl utilise l'analyse des packages, le paramètre dialect est donc requis.

8. Conclusion

Dans ce didacticiel, nous avons illustré plusieurs façons d'utiliser Liquibase et d'arriver à une manière sûre et mature d' évoluer et de refactoriser le schéma de base de données d'une application Java .

L'implémentation de tous ces exemples et extraits de code peut être trouvée dans mon projet github - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.