Brug Liquibase til sikker udvikling af dit databaseskema

1. Oversigt

I denne hurtige vejledning bruger vi Liquibase til at udvikle databaseskemaet af en Java-webapplikation.

Vi vil først fokusere på en generel Java-app, og vi vil også tage et fokuseret kig på nogle interessante muligheder til foråret og dvale.

Meget kort er kernen i at bruge Liquibase det ændre log fil - en XML-fil, der holder styr på alle ændringer, der skal køres for at opdatere DB.

Lad os starte med den Maven-afhængighed, vi skal tilføje til vores pom.xml:

 org.liquibase liquibase-core 3.4.1 

Du kan også kontrollere, om der er en nyere version af liquibase-core her.

2. Databaseændringsloggen

Lad os nu se på et simpelt ændre log fil - denne tilføjer kun en kolonne “adresse”Til bordet“brugere“:

Bemærk, hvordan ændringssættet identificeres af en id og en forfatter - for at sikre, at det kan identificeres entydigt og kun anvendes én gang.

Lad os ikke se, hvordan vi kan koble dette til vores applikation og sørge for, at det kører, når applikationen starter op.

3. Kør Liquibase med en Spring Bean

Vores første mulighed for at køre ændringerne ved opstart af applikationen er via en Spring bean. Der er selvfølgelig mange andre måder, men hvis vi har at gøre med en Spring-applikation - er dette en god, enkel måde at gå:

@Bean offentlig SpringLiquibase liquibase () {SpringLiquibase liquibase = ny SpringLiquibase (); liquibase.setChangeLog ("classpath: liquibase-changeLog.xml"); liquibase.setDataSource (dataSource ()); returnere liquibase; }

Bemærk hvordan vi peger på en gyldig ændre log fil, der skal eksistere på klassestien.

4. Brug Liquibase With Spring Boot

Hvis du bruger Spring Boot, er det ikke nødvendigt at definere en Bønne til Liquibase.

Alt hvad du behøver er at sætte din ændringslog ind “db / changelog / db.changelog-master.yaml”Og Liquibase-migreringer kører automatisk ved opstart.

Noter det:

  • Du skal tilføje “liquibase-kerne”Afhængighed.
  • Du kan ændre standardændringslogfil ved hjælp af “liquibase.change-log”Ejendom - for eksempel:
liquibase.change-log = classpath: liquibase-changeLog.xml

5. Deaktiver Liquibase i Spring Boot

Nogle gange er vi muligvis nødt til at deaktivere udførelsen af ​​Liquibase-migrering ved opstart.

Den enkleste mulighed, vi har, er at bruge en spring.liquibase.enabled ejendom. På denne måde forbliver al den resterende Liquibase-konfiguration uberørt.

Her er eksemplet for Spring Boot 2:

spring.liquibase.enabled = false

For Spring Boot 1.x skal vi bruge en liquibase.enabled ejendom:

liquibase.enabled = false

6. Generer ændre log Med et Maven-plugin

I stedet for at skrive ændre log fil manuelt - vi kan bruge Liquibase Maven-pluginet til at generere et og spare os meget arbejde.

6.1. Plugin-konfiguration

Her er ændringer til vores 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. Generer en ChangeLog Fra en eksisterende database

Vi kan bruge pluginet til at generere en Changelog fra en eksisterende database:

mvn liquibase: createChangeLog

Her er de liquibase egenskaber:

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

Slutresultatet er et ændre log fil, som vi enten kan bruge til at oprette et indledende DB-skema eller til at udfylde data. Sådan ser det ud for vores eksempelapp:

                     ... 

6.3. Generer en ChangeLog Fra forskellen mellem to databaser

Vi kan bruge pluginet til at generere en ændre log fil fra forskellene mellem to eksisterende databaser (for eksempel: udvikling og produktion):

mvn liquibase: diff

Her er egenskaberne:

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

Og her er et uddrag af det genererede ændre log:

Dette er en superkraftig måde at udvikle din DB ved - for eksempel - at lade dvale automatisk generere et nyt skema til udvikling og derefter bruge det som referencepunkt mod det gamle skema.

7. Brug Liquibase Hibernate Plugin

Hvis applikationen bruger dvale - vil vi se på en meget nyttig måde at generere ændre log.

Først - her er hvordan flydende-dvale plugin skal konfigureres i Maven:

7.1. Plugin-konfiguration

Lad os først konfigurere det nye plugin og bruge de rigtige afhængigheder:

  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.FRIGIVELSE 

7.2. Generer en ændre log fra forskelle mellem en database og vedvarende enheder

Nu til den sjove del. Vi kan bruge dette plugin til at generere en ændre log fil fra forskellene mellem en eksisterende database (for eksempel produktion) og vores nye persistensenheder.

Så - for at gøre tingene enkle - når en enhed er ændret, kan du ganske enkelt generere ændringerne i forhold til det gamle DB-skema en ren, kraftfuld måde at udvikle dit skema på i produktionen.

Her er liquibase-egenskaberne:

changeLogFile = classpath: liquibase-changeLog.xml url = jdbc: mysql: // localhost: 3306 / oauth_reddit brugernavn = tutorialbrugeradgangskode = tutorialmy5ql driver = com.mysql.jdbc.Driver referenceUrl = dvale: forår: org.baeldung.persistence.mod ? dialect = org.hibernate.dialect.MySQLDialect diffChangeLogFile = src / main / resources / liquibase-diff-changeLog.xml

Bemærk: referenceUrl bruger pakkescanning, så dialekt parameter er påkrævet.

8. Konklusion

I denne vejledning illustrerede vi flere måder at bruge Liquibase på og komme til en sikker og moden måde udvikling og refactoring af DB-skemaet for en Java-app.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i mit github-projekt - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.