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

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

1. Vue d'ensemble

Dans ce rapide didacticiel, nous utiliseronsLiquibase to evolve the database schema 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 estthe changeLog file - 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 nospom.xml:


    org.liquibase
     liquibase-core
      3.4.1

Vous pouvez également vérifier s’il existe une version plus récente de liquibase-corehere.

Lectures complémentaires:

Introduction à la restauration de Liquibase

Apprenez à utiliser la fonction de retour en arrière d'un framework Liquibase.

Read more

Migrations de base de données avec Flyway

Cet article décrit les concepts clés de Flyway et comment nous pouvons utiliser ce framework pour remodeler en continu le schéma de base de données de notre application de manière fiable et simple.

Read more

Guide rapide sur le chargement de données initiales avec Spring Boot

Exemple rapide et pratique d'utilisation des fichiers data.sql et schema.sql dans Spring Boot.

Read more

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

Examinons maintenant un simple fichierchangeLog - celui-ci n'ajoute qu'une colonne «address» à la table «users»:



    
        
            
        
    

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

Ne voyons pas comment le connecter à notre application et nous assurer qu’il s’exécute au démarrage de l’application.

3. Exécutez Liquibase avec un Spring Bean

Notre première option pour exécuter les modifications au démarrage de l'application consiste à utiliser 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 solution simple:

@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 fichierchangeLog valide qui doit exister sur le chemin de classe.

4. Utiliser Liquibase avec Spring Boot

Si vous utilisezSpring Boot, il n'est pas nécessaire de définir unBean 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 la 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ésactiver Liquibase dans Spring Boot

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

The simplest option we have is to use a spring.liquibase.enabled property. De cette façon, toute la configuration Liquibase restante 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érer leschangeLog avec un plugin Maven

Au lieu d'écrire manuellement le fichierchangeLog, 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 à nospom.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 unChangeLog à partir d'une base de données existante

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

mvn liquibase:generateChangeLog

Voici lesliquibase properties:

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 fichierchangeLog 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 unChangeLog à partir de Diff entre deux bases de données

Nous pouvons utiliser le plugin pour générer un fichierchangeLog à 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 deschangeLog générés:



    
        
    

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

7. Utilisez le plugin Liquibase Hibernate

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

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

7.1. Configuration du plugin

Commençons par configurer le nouveau plugin et utiliser 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 unchangeLog à partir de 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 fichierchangeLog à 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, en obtenanta clean, powerful way to evolve your schema in production.

Voici les propriétés de 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.example.persistence.model
  ?dialect=org.hibernate.dialect.MySQLDialect
diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml

Remarque: LereferenceUrl utilise l'analyse de package, le paramètredialect est donc requis.

8. Conclusion

Dans ce tutoriel, nous avons illustré plusieurs façons d'utiliser Liquibase et d'arriver à une méthode sûre et mature deevolving and refactoring the DB schema of a Java app.

L'implémentation de tous ces exemples et extraits de codecan be found inmy github project - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.