Используйте Liquibase для безопасного развития вашей схемы базы данных

Используйте Liquibase для безопасного развития вашей схемы базы данных

1. обзор

В этом кратком руководстве мы будем использоватьLiquibase to evolve the database schema веб-приложения Java.

Сначала мы сосредоточимся на общем Java-приложении, а также рассмотрим некоторые интересные варианты, доступные для Spring и Hibernate.

Вкратце, ядро ​​использования Liquibase - этоthe changeLog file - файл XML, в котором отслеживаются все изменения, которые необходимо выполнить для обновления БД.

Начнем с зависимости Maven, которую нам нужно добавить в нашpom.xml:


    org.liquibase
     liquibase-core
      3.4.1

Вы также можете проверить, есть ли более новая версия liquibase-corehere.

Дальнейшее чтение:

Введение в Liquibase Rollback

Узнайте, как использовать функцию отката платформы Liquibase.

Read more

Миграция базы данных с Flyway

В этой статье описываются ключевые концепции Flyway и то, как мы можем использовать эту структуру для постоянного и надежного изменения схемы базы данных нашего приложения.

Read more

Краткое руководство по загрузке исходных данных с помощью Spring Boot

Быстрый и практический пример использования файлов data.sql и schema.sql в Spring Boot.

Read more

2. Журнал изменений базы данных

Теперь давайте посмотрим на простой файлchangeLog - он добавляет только столбец «address» в таблицу «users»:



    
        
            
        
    

Обратите внимание, как набор изменений идентифицируетсяid иauthor - чтобы убедиться, что он может быть однозначно идентифицирован и применяться только один раз.

Давайте не будем смотреть, как подключить это к нашему приложению и убедиться, что он запускается при запуске приложения.

3. Запустите Liquibase с Spring Bean

Наш первый вариант запуска изменений при запуске приложения - через bean-компонент Spring. Конечно, есть много других способов, но если мы имеем дело с приложением Spring - это хороший и простой способ:

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

Обратите внимание, как мы указываем на действительный файлchangeLog, который должен существовать в пути к классам.

4. Используйте Liquibase с Spring Boot

Если вы используетеSpring Boot, нет необходимости определятьBean для Liquibase.

Все, что вам нужно, это поместить журнал изменений в «db/changelog/db.changelog-master.yaml», и миграции Liquibase будут запускаться автоматически при запуске.

Обратите внимание, что:

  • Вам нужно добавить зависимость «liquibase-core».

  • Вы можете изменить файл журнала изменений по умолчанию, используя свойство «liquibase.change-log» - например:

liquibase.change-log=classpath:liquibase-changeLog.xml

5. Отключить Liquibase в весенней загрузке

Иногда нам может потребоваться отключить выполнение миграции Liquibase при запуске.

The simplest option we have is to use a spring.liquibase.enabled property. Таким образом, все оставшиеся конфигурации Liquibase остаются нетронутыми.

Вот пример для Spring Boot 2:

spring.liquibase.enabled=false

Для Spring Boot 1.x нам нужно использовать свойствоliquibase.enabled:

liquibase.enabled=false

6. СоздайтеchangeLog с помощью подключаемого модуля Maven

Вместо того, чтобы писать файлchangeLog вручную, мы можем использовать плагин Liquibase Maven для его создания и сэкономить много времени.

6.1. Конфигурация плагина

Вот изменения в нашем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. СоздатьChangeLog из существующей базы данных

Мы можем использовать плагин для генерации журнала изменений из существующей базы данных:

mvn liquibase:generateChangeLog

Вотliquibase properties:

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

Конечным результатом является файлchangeLog, который мы можем использовать либо для создания начальной схемы БД, либо для заполнения данных. Вот как это будет выглядеть в нашем примере приложения:




    
        
            
                
            
            
            
                
            
            
            
            
            
                
            
            
            
        
    
    ...

6.3. СоздатьChangeLog из различий между двумя базами данных

Мы можем использовать плагин для создания файлаchangeLog из различий между двумя существующими базами данных (например: разработка и производство):

mvn liquibase:diff

Вот свойства:

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=

А вот фрагмент сгенерированногоchangeLog:



    
        
    

Это очень мощный способ развития вашей БД, например, позволяющий Hibernate автоматически генерировать новую схему для разработки, а затем использовать ее в качестве ориентира для старой схемы.

7. Используйте плагин Liquibase Hibernate

Если приложение использует Hibernate, мы рассмотрим очень полезный способ генерацииchangeLog.

Во-первых, вот как нужно настроитьthe liquibase-hibernate plugin в Maven:

7.1. Конфигурация плагина

Во-первых, давайте настроим новый плагин и будем использовать правильные зависимости:


    
        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. СгенерируйтеchangeLog из различий между базой данных и постоянными объектами

Теперь самое интересное. Мы можем использовать этот плагин для создания файлаchangeLog на основе различий между существующей базой данных (например, производственной) и нашими новыми сущностями сохранения.

Итак - чтобы упростить - после изменения сущности вы можете просто сгенерировать изменения для старой схемы БД, получивa clean, powerful way to evolve your schema in production.

Вот свойства ликвидазы:

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

Примечание.referenceUrl использует сканирование пакетов, поэтому параметрdialect является обязательным.

8. Заключение

В этом руководстве мы проиллюстрировали несколько способов использования Liquibase и перехода к безопасному и зрелому способуevolving and refactoring the DB schema of a Java app.

Реализация всех этих примеров и фрагментов кодаcan be found inmy github project - это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.