Utilice Liquibase para desarrollar de forma segura el esquema de su base de datos

1. Información general

En este tutorial rápido, usaremos Liquibase para desarrollar el esquema de base de datos de una aplicación web Java.

Primero nos centraremos en una aplicación Java general, y también vamos a echar un vistazo a algunas opciones interesantes disponibles para Spring e Hibernate.

Muy brevemente, el núcleo del uso de Liquibase es el archivo changeLog , un archivo XML que realiza un seguimiento de todos los cambios que deben ejecutarse para actualizar la base de datos.

Comencemos con la dependencia de Maven que necesitamos agregar a nuestro pom.xml :

 org.liquibase liquibase-core 3.4.1 

También puede comprobar si hay una versión más reciente de liquibase-core aquí.

2. El registro de cambios de la base de datos

Ahora, echemos un vistazo a un simple archivo changeLog ; este solo agrega una columna " dirección " a la tabla " usuarios ":

Tenga en cuenta cómo el conjunto de cambios se identifica mediante una identificación y un autor , para asegurarse de que se pueda identificar de forma única y solo se aplique una vez.

No veamos cómo conectar esto a nuestra aplicación y asegurarnos de que se ejecute cuando se inicie la aplicación.

3. Ejecute Liquibase con Spring Bean

Nuestra primera opción para ejecutar los cambios al iniciar la aplicación es a través de un bean Spring. Por supuesto, hay muchas otras formas, pero si estamos tratando con una aplicación Spring, esta es una buena y sencilla forma de hacerlo:

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

Observe cómo lo estamos apuntando a un archivo changeLog válido que debe existir en la ruta de clases.

4. Utilice Liquibase con Spring Boot

Si está utilizando Spring Boot, no es necesario definir un Bean para Liquibase.

Todo lo que necesita es poner su registro de cambios en “ db / changelog / db.changelog-master.yaml ” y las migraciones de Liquibase se ejecutarán automáticamente al inicio.

Tenga en cuenta que:

  • Debe agregar la dependencia " liquibase-core ".
  • Puede cambiar el archivo de registro de cambios predeterminado utilizando la propiedad " liquibase.change-log ", por ejemplo:
liquibase.change-log=classpath:liquibase-changeLog.xml

5. Deshabilite Liquibase en Spring Boot

A veces, es posible que debamos deshabilitar la ejecución de la migración de Liquibase al inicio.

La opción más simple que tenemos es usar una propiedad spring.liquibase.enabled . De esta manera, toda la configuración de Liquibase restante permanece intacta.

Aquí está el ejemplo de Spring Boot 2:

spring.liquibase.enabled=false

Para Spring Boot 1.x, necesitamos usar una propiedad liquibase.enabled :

liquibase.enabled=false

6. Genere el changeLog con un complemento de Maven

En lugar de escribir el archivo changeLog manualmente, podemos usar el complemento Liquibase Maven para generar uno y ahorrarnos mucho trabajo.

6.1. Configuración del complemento

Aquí están los cambios en nuestro 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. Generar un registro de cambios a partir de una base de datos existente

Podemos usar el complemento para generar un registro de cambios desde una base de datos existente:

mvn liquibase:generateChangeLog

Aquí están las propiedades de la liquibase :

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

El resultado final es un archivo changeLog que podemos usar para crear un esquema de base de datos inicial o para completar datos. Así es como se vería en nuestra aplicación de ejemplo:

                     ... 

6.3. Generar un registro de cambios a partir de la diferencia entre dos bases de datos

Podemos usar el complemento para generar un archivo changeLog a partir de las diferencias entre dos bases de datos existentes (por ejemplo: desarrollo y producción):

mvn liquibase:diff

Aquí están las propiedades:

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=

Y aquí hay un fragmento del changeLog generado :

Esta es una forma súper poderosa de hacer evolucionar su base de datos, por ejemplo, permitiendo que Hibernate genere automáticamente un nuevo esquema para el desarrollo y luego usándolo como punto de referencia contra el esquema anterior.

7. Utilice el complemento Liquibase Hibernate

Si la aplicación usa Hibernate, veremos una forma muy útil de generar el changeLog .

Primero, así es como se debe configurar el complemento liquibase-hibernate en Maven:

7.1. Configuración del complemento

Primero, configuremos el nuevo complemento y usemos las dependencias correctas:

  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. Generar un registro de cambios a partir de diferencias entre una base de datos y entidades de persistencia

Ahora viene la parte divertida. Podemos usar este complemento para generar un archivo changeLog a partir de las diferencias entre una base de datos existente (por ejemplo, producción) y nuestras nuevas entidades de persistencia.

Entonces, para simplificar las cosas, una vez que se modifica una entidad, simplemente puede generar los cambios contra el antiguo esquema de base de datos, obteniendo una forma limpia y poderosa de evolucionar su esquema en producción .

Aquí están las propiedades de la 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 está utilizando la exploración de paquetes, por lo que se requiere el parámetro dialecto .

8. Conclusión

En este tutorial ilustramos varias formas de usar Liquibase y llegar a una forma segura y madura de evolucionar y refactorizar el esquema de base de datos de una aplicación Java .

La implementación de todos estos ejemplos y fragmentos de código se puede encontrar en mi proyecto de github ; este es un proyecto basado en Eclipse, por lo que debería ser fácil de importar y ejecutar tal como está.