Usa Liquibase per evolvere in modo sicuro il tuo schema di database

1. Panoramica

In questo breve tutorial, utilizzeremo Liquibase per evolvere lo schema del database di un'applicazione web Java.

Ci concentreremo prima su un'app Java generale e daremo anche uno sguardo mirato ad alcune interessanti opzioni disponibili per Spring e Hibernate.

Molto brevemente, il nucleo dell'utilizzo di Liquibase è il file changeLog , un file XML che tiene traccia di tutte le modifiche che devono essere eseguite per aggiornare il DB.

Cominciamo con la dipendenza Maven che dobbiamo aggiungere al nostro pom.xml :

 org.liquibase liquibase-core 3.4.1 

Puoi anche verificare se c'è una versione più recente di liquibase-core qui.

2. Il registro delle modifiche al database

Ora, diamo un'occhiata a un semplice file changeLog - questo aggiunge solo una colonna " indirizzo " alla tabella " utenti ":

Nota come la serie di modifiche viene identificata da un id e da un autore , per assicurarti che possa essere identificata in modo univoco e applicata solo una volta.

Non vediamo come collegarlo alla nostra applicazione e assicurarci che venga eseguito all'avvio dell'applicazione.

3. Eseguire Liquibase con uno Spring Bean

La nostra prima opzione per eseguire le modifiche all'avvio dell'applicazione è tramite un bean Spring. Ci sono ovviamente molti altri modi, ma se abbiamo a che fare con un'applicazione Spring, questo è un modo semplice e buono:

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

Nota come lo stiamo puntando a un file changeLog valido che deve esistere sul classpath.

4. Utilizzare Liquibase con Spring Boot

Se stai usando Spring Boot, non è necessario definire un bean per Liquibase.

Tutto ciò che serve è mettere il registro delle modifiche in " db / changelog / db.changelog-master.yaml " e le migrazioni Liquibase verranno eseguite automaticamente all'avvio.

Nota che:

  • È necessario aggiungere la dipendenza " liquibase-core ".
  • È possibile modificare il file di registro delle modifiche predefinito utilizzando la proprietà " liquibase.change-log ", ad esempio:
liquibase.change-log=classpath:liquibase-changeLog.xml

5. Disabilitare Liquibase in Spring Boot

A volte, potrebbe essere necessario disabilitare l'esecuzione della migrazione di Liquibase all'avvio.

L'opzione più semplice che abbiamo è quella di utilizzare una proprietà spring.liquibase.enabled . In questo modo, tutta la restante configurazione di Liquibase rimane invariata.

Ecco l'esempio per Spring Boot 2:

spring.liquibase.enabled=false

Per Spring Boot 1.x, dobbiamo usare una proprietà liquibase.enabled :

liquibase.enabled=false

6. Genera il changeLog con un plugin Maven

Invece di scrivere manualmente il file changeLog , possiamo usare il plugin Liquibase Maven per generarne uno e risparmiarci un sacco di lavoro.

6.1. Configurazione plug-in

Ecco le modifiche al nostro 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. Genera un registro modifiche da un database esistente

Possiamo usare il plugin per generare un registro delle modifiche da un database esistente:

mvn liquibase:generateChangeLog

Ecco le proprietà della liquibase :

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

Il risultato finale è un file changeLog che possiamo utilizzare per creare uno schema DB iniziale o per popolare i dati. Ecco come sarebbe per la nostra app di esempio:

                     ... 

6.3. Genera un registro delle modifiche dalla differenza tra due database

Possiamo utilizzare il plugin per generare un file changeLog dalle differenze tra due database esistenti (ad esempio: sviluppo e produzione):

mvn liquibase:diff

Ecco le proprietà:

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=

Ed ecco uno snippet del changeLog generato :

Questo è un modo super potente per far evolvere il tuo DB, ad esempio, consentendo a Hibernate di generare automaticamente un nuovo schema per lo sviluppo e quindi utilizzandolo come punto di riferimento contro il vecchio schema.

7. Utilizzare il plug-in Liquibase Hibernate

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.

Quindi, per semplificare le cose, una volta modificata un'entità, puoi semplicemente generare le modifiche rispetto al vecchio schema DB, ottenendo un modo pulito e potente per far evolvere il tuo schema in produzione .

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

Nota: referenceUrl utilizza la scansione del pacchetto, quindi il parametro dialect è obbligatorio.

8. Conclusione

In questo tutorial abbiamo illustrato diversi modi per utilizzare Liquibase e arrivare a un modo sicuro e maturo di evolvere e refactoring dello schema DB di un'app Java .

L'implementazione di tutti questi esempi e frammenti di codice può essere trovata nel mio progetto GitHub : questo è un progetto basato su Eclipse, quindi dovrebbe essere facile da importare ed eseguire così com'è.