Verwenden Sie Liquibase, um Ihr Datenbankschema sicher weiterzuentwickeln

Verwenden Sie Liquibase, um Ihr Datenbankschema sicher zu entwickeln

1. Überblick

In diesem kurzen Tutorial verwenden wirLiquibase to evolve the database schema einer Java-Webanwendung.

Wir werden uns zuerst auf eine allgemeine Java-App konzentrieren und uns einige interessante Optionen für Spring und Hibernate genauer ansehen.

Kurz gesagt, der Kern der Verwendung von Liquibase istthe changeLog file - eine XML-Datei, die alle Änderungen protokolliert, die zum Aktualisieren der Datenbank ausgeführt werden müssen.

Beginnen wir mit der Maven-Abhängigkeit, die wir zu unserenpom.xmlhinzufügen müssen:


    org.liquibase
     liquibase-core
      3.4.1

Sie können auch überprüfen, ob es eine neuere Version von Liquibase-Coreheregibt.

Weitere Lektüre:

Einführung in Liquibase Rollback

Erfahren Sie, wie Sie die Rollback-Funktion eines Liquibase-Frameworks verwenden.

Read more

Datenbankmigrationen mit Flyway

Dieser Artikel beschreibt die wichtigsten Konzepte von Flyway und wie wir dieses Framework verwenden können, um das Datenbankschema unserer Anwendung zuverlässig und einfach kontinuierlich umzugestalten.

Read more

Kurzanleitung zum Laden von Anfangsdaten mit Spring Boot

Ein schnelles und praktisches Beispiel für die Verwendung von data.sql- und schema.sql-Dateien in Spring Boot.

Read more

2. Das Datenbankänderungsprotokoll

Schauen wir uns nun eine einfachechangeLog-Datei an - diese fügt der Tabelle "users" nur eine Spalte "address" hinzu:



    
        
            
        
    

Beachten Sie, wie der Änderungssatz durchid undauthor identifiziert wird, um sicherzustellen, dass er eindeutig identifiziert und nur einmal angewendet werden kann.

Lassen Sie uns nicht sehen, wie Sie dies mit unserer Anwendung verbinden und sicherstellen, dass sie beim Start der Anwendung ausgeführt wird.

3. Führen Sie Liquibase mit einer Spring Bean aus

Unsere erste Option, um die Änderungen beim Start der Anwendung auszuführen, ist eine Spring Bean. Es gibt natürlich viele andere Möglichkeiten, aber wenn es sich um eine Spring-Anwendung handelt, ist dies ein guter und einfacher Weg:

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

Beachten Sie, wie wir auf eine gültigechangeLog-Datei verweisen, die im Klassenpfad vorhanden sein muss.

4. Verwenden Sie Liquibase mit Spring Boot

Wenn SieSpring Boot verwenden, müssen Sie für Liquibase keinBean definieren.

Sie müssen lediglich Ihr Änderungsprotokoll in "db/changelog/db.changelog-master.yaml" ablegen, und Liquibase-Migrationen werden beim Start automatisch ausgeführt.

Beachten Sie, dass:

  • Sie müssen die Abhängigkeit "liquibase-core" hinzufügen.

  • Sie können die Standard-Änderungsprotokolldatei mithilfe der Eigenschaft "liquibase.change-log" ändern. Beispiel:

liquibase.change-log=classpath:liquibase-changeLog.xml

5. Deaktivieren Sie Liquibase in Spring Boot

Manchmal müssen wir möglicherweise die Ausführung der Liquibase-Migration beim Start deaktivieren.

The simplest option we have is to use a spring.liquibase.enabled property. Auf diese Weise bleibt die gesamte verbleibende Liquibase-Konfiguration unberührt.

Hier ist das Beispiel für Spring Boot 2:

spring.liquibase.enabled=false

Für Spring Boot 1.x müssen wir die Eigenschaftliquibase.enabledverwenden:

liquibase.enabled=false

6. Generiere diechangeLog mit einem Maven Plugin

Anstatt diechangeLog-Datei manuell zu schreiben, können wir das Liquibase Maven-Plugin verwenden, um eine zu generieren und uns viel Arbeit zu sparen.

6.1. Plugin-Konfiguration

Hier sind die Änderungen an unserenpom.xml:


    org.liquibase
    liquibase-maven-plugin
    3.4.1

...

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

6.2. Generieren Sie einChangeLog aus einer vorhandenen Datenbank

Wir können das Plugin verwenden, um ein Änderungsprotokoll aus einer vorhandenen Datenbank zu generieren:

mvn liquibase:generateChangeLog

Hier sind dieliquibase properties:

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

Das Endergebnis ist einechangeLog-Datei, mit der wir entweder ein anfängliches DB-Schema erstellen oder Daten füllen können. So würde das für unsere Beispiel-App aussehen:




    
        
            
                
            
            
            
                
            
            
            
            
            
                
            
            
            
        
    
    ...

6.3. Generieren Sie einChangeLog aus Diff zwischen zwei Datenbanken

Wir können das Plugin verwenden, um einechangeLog-Datei aus den Unterschieden zwischen zwei vorhandenen Datenbanken zu generieren (zum Beispiel: Entwicklung und Produktion):

mvn liquibase:diff

Hier sind die Eigenschaften:

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=

Und hier ist ein Ausschnitt der generiertenchangeLog:



    
        
    

Dies ist eine sehr leistungsfähige Möglichkeit, Ihre Datenbank zu entwickeln, indem Sie beispielsweise Hibernate erlauben, automatisch ein neues Schema für die Entwicklung zu generieren und dieses dann als Referenz für das alte Schema zu verwenden.

7. Verwenden Sie das Liquibase Hibernate Plugin

Wenn die Anwendung den Ruhezustand verwendet, werden wir uns eine sehr nützliche Methode zum Generieren vonchangeLogansehen.

Erstens: So solltenthe liquibase-hibernate plugin in Maven konfiguriert werden:

7.1. Plugin-Konfiguration

Lassen Sie uns zunächst das neue Plugin konfigurieren und die richtigen Abhängigkeiten verwenden:


    
        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. Generieren Sie einchangeLog aus Diffs zwischen einer Datenbank und Persistenzentitäten

Nun zum spaßigen Teil. Mit diesem Plugin können wir einechangeLog-Datei aus den Unterschieden zwischen einer vorhandenen Datenbank (z. B. Produktion) und unseren neuen Persistenzentitäten generieren.

Um die Sache zu vereinfachen: Sobald eine Entität geändert wurde, können Sie die Änderungen einfach für das alte DB-Schema generieren unda clean, powerful way to evolve your schema in production abrufen.

Hier sind die liquibase Eigenschaften:

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

Hinweis:referenceUrl verwendet den Paketscan, daher ist der Parameterdialect erforderlich.

8. Fazit

In diesem Tutorial haben wir verschiedene Möglichkeiten aufgezeigt, wie Sie Liquibase verwenden und eine sichere und ausgereifte Methode fürevolving and refactoring the DB schema of a Java app finden.

Die Implementierung all dieser Beispiele und Codefragmentecan be found inmy github project - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.