Bruk Liquibase til å sikkert utvikle databaseskjemaet ditt

1. Oversikt

I denne raske opplæringen bruker vi Liquibase for å utvikle databaseskjemaet av en Java-webapplikasjon.

Vi skal først fokusere på en generell Java-app, og vi vil også ta en fokusert titt på noen interessante alternativer som er tilgjengelige for vår og dvalemodus.

Svært kort er kjernen i å bruke Liquibase de endre logg fil - en XML-fil som holder oversikt over alle endringene som må kjøres for å oppdatere DB.

La oss starte med Maven-avhengigheten vi trenger å legge til i vår pom.xml:

 org.liquibase liquibase-core 3.4.1 

Du kan også sjekke om det er en nyere versjon av liquibase-core her.

2. Databaseendringsloggen

La oss ta en titt på en enkel endre logg fil - denne legger bare til en kolonne “adresse”Til bordet“brukere“:

Legg merke til hvordan endringssettet identifiseres av en id og en forfatter - for å sikre at den kan identifiseres unikt og bare brukes en gang.

La oss ikke se hvordan vi kan koble dette til applikasjonen vår og sørge for at den kjører når applikasjonen starter.

3. Kjør Liquibase med en vårbønne

Vårt første alternativ for å kjøre endringene ved oppstart av applikasjonen er via en Spring Bean. Det er selvfølgelig mange andre måter, men hvis vi har å gjøre med en vårapplikasjon - er dette en god, enkel vei å gå:

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

Legg merke til hvordan vi peker på en gyldig endre logg filen som må eksistere på klassestien.

4. Bruk Liquibase With Spring Boot

Hvis du bruker Spring Boot, er det ikke nødvendig å definere en Bønne for Liquibase.

Alt du trenger er å legge inn endringsloggen din “db / changelog / db.changelog-master.yaml”Og Liquibase-migrasjoner vil kjøre automatisk ved oppstart.

Noter det:

  • Du må legge til “liquibase-kjerne”Avhengighet.
  • Du kan endre standard endringsloggfil ved å bruke “liquibase.change-log”Eiendom - for eksempel:
liquibase.change-log = classpath: liquibase-changeLog.xml

5. Deaktiver Liquibase i Spring Boot

Noen ganger kan det hende vi må deaktivere kjøringen av Liquibase-migrering ved oppstart.

Det enkleste alternativet vi har er å bruke en spring.liquibase.enabled eiendom. På denne måten forblir all gjenværende Liquibase-konfigurasjon uberørt.

Her er eksemplet for Spring Boot 2:

spring.liquibase.enabled = false

For Spring Boot 1.x, må vi bruke a liquibase. aktivert eiendom:

liquibase.enabled = false

6. Generer endre logg Med et Maven-plugin

I stedet for å skrive endre logg fil manuelt - vi kan bruke Liquibase Maven-pluginet til å generere en og spare oss for mye arbeid.

6.1. Plugin-konfigurasjon

Her er endringene i vår 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 bruke pluginet til å generere en Changelog fra en eksisterende database:

mvn liquibase: createChangeLog

Her er væskeegenskaper:

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

Sluttresultatet er et endre logg fil som vi kan bruke til å lage et innledende DB-skjema eller for å fylle ut data. Slik ser det ut for eksempelappen vår:

                     ... 

6.3. Generer en ChangeLog Fra forskjellen mellom to databaser

Vi kan bruke pluginet til å generere en endre logg fil fra forskjellene mellom to eksisterende databaser (for eksempel: utvikling og produksjon):

mvn liquibase: diff

Her er egenskapene:

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

Og her er et utdrag av den genererte endre logg:

Dette er en superkraftig måte å utvikle DB-en din på - for eksempel - å la dvalemodus automatisk generere et nytt skjema for utvikling, og deretter bruke det som referansepunkt mot det gamle skjemaet.

7. Bruk Liquibase Hibernate Plugin

Hvis applikasjonen bruker dvalemodus - skal vi se på en veldig nyttig måte å generere endre logg.

Først - her er hvordan væskefase-dvalemodus plugin skal konfigureres i Maven:

7.1. Plugin-konfigurasjon

La oss først konfigurere det nye pluginet og bruke de riktige avhengighetene:

  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.FRIGJØRING 

7.2. Generer en endre logg fra Diffs Between a Database and Persistence Entities

Nå, for den morsomme delen. Vi kan bruke dette pluginet til å generere en endre logg fil fra forskjellene mellom en eksisterende database (for eksempel produksjon) og våre nye utholdenhetsenheter.

Så - for å gjøre ting enkelt - når en enhet er endret, kan du ganske enkelt generere endringene mot det gamle DB-skjemaet en ren, kraftig måte å utvikle skjemaet ditt i produksjonen.

Her er liquibase-egenskapene:

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

Merk: referanseUrl bruker pakkeskanning, så dialekt parameter kreves.

8. Konklusjon

I denne opplæringen illustrerte vi flere måter å bruke Liquibase og komme til en trygg og moden måte å utvikle og omorganisere DB-skjemaet til en Java-app.

Implementeringen av alle disse eksemplene og kodebiter finner du i mitt github-prosjekt - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.