Verwenden Sie Liquibase, um Ihr Datenbankschema sicher weiterzuentwickeln

1. Übersicht

In diesem kurzen Tutorial verwenden wir Liquibase, um das Datenbankschema einer Java-Webanwendung weiterzuentwickeln .

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 ist die changeLog- Datei - 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 in unsere pom.xml aufnehmen müssen :

 org.liquibase liquibase-core 3.4.1 

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

2. Das Datenbankänderungsprotokoll

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

Beachten Sie, wie der Änderungssatz durch eine ID und einen Autor identifiziert wird , um sicherzustellen, dass er eindeutig identifiziert und nur einmal angewendet werden kann.

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

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

Unsere erste Option zum Ausführen der Änderungen beim Start der Anwendung 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, 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ültige changeLog- Datei verweisen, die im Klassenpfad vorhanden sein muss.

4. Verwenden Sie Liquibase With Spring Boot

Wenn Sie Spring Boot verwenden, müssen Sie keine Bean für Liquibase definieren.

Sie müssen lediglich Ihr Änderungsprotokoll in " db / changelog / db.changelog-master.yaml " ablegen. Die 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 im Spring Boot

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

Die einfachste Option ist die Verwendung einer spring.liquibase.enabled- Eigenschaft . 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 eine liquibase.enabled- Eigenschaft verwenden:

liquibase.enabled=false

6. Generieren Sie das changeLog mit einem Maven Plugin

Anstatt die changeLog- 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 unserer 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. Generieren Sie ein ChangeLog aus einer vorhandenen Datenbank

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

mvn liquibase:generateChangeLog

Hier sind die Liquibase-Eigenschaften :

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 eine changeLog- Datei, mit der wir entweder ein erstes DB-Schema erstellen oder Daten füllen können. So würde das für unsere Beispiel-App aussehen:

                     ... 

6.3. Generieren Sie ein ChangeLog aus Diff zwischen zwei Datenbanken

Wir können das Plugin verwenden, um eine changeLog- 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 aus dem generierten changeLog :

Dies ist eine sehr leistungsstarke Methode, um Ihre Datenbank weiterzuentwickeln, indem Hibernate beispielsweise automatisch ein neues Schema für die Entwicklung generiert und dieses dann als Referenzpunkt für das alte Schema verwendet.

7. Verwenden Sie das Liquibase Hibernate Plugin

If the application uses Hibernate – we're going to take a look at a very useful way of generating the changeLog.

First – here's how the liquibase-hibernate plugin should be configured in Maven:

7.1. Plugin Configuration

First, let's get the new plugin configured and using the right dependencies:

  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. Generate a changeLog from Diffs Between a Database and Persistence Entities

Now, for the fun part. We can use this plugin to generate a changeLog file from the differences between an existing database (for example production) and our new persistence entities.

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 und erhalten so eine saubere und leistungsstarke Möglichkeit, Ihr Schema in der Produktion weiterzuentwickeln .

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.baeldung.persistence.model ?dialect=org.hibernate.dialect.MySQLDialect diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml

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

8. Fazit

In diesem Tutorial haben wir verschiedene Möglichkeiten aufgezeigt, wie Sie Liquibase verwenden und eine sichere und ausgereifte Methode zum Entwickeln und Umgestalten des DB-Schemas einer Java-App finden .

Die Implementierung all dieser Beispiele und Codefragmente finden Sie in meinem Github-Projekt - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.