Рубрики
Без рубрики

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

Как использовать Liquibase для безопасного и зрелого развития схемы базы данных вашего Java-приложения.

Автор оригинала: baeldung.

1. Обзор

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

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

Очень кратко, ядром использования Liquibase является файл changeLog file – XML-файл, который отслеживает все изменения, которые необходимо выполнить для обновления базы данных.

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


    org.liquibase
     liquibase-core
      3.4.1

Мы также можем проверить, есть ли более новая версия liquibase-core здесь .

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

Введение в откат ликвидной базы

Миграции баз данных с помощью Flyway

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

2. Журнал Изменений Базы Данных

Теперь давайте взглянем на простой файл changeLog – этот файл добавляет только столбец ” адрес “в таблицу” пользователи “:


    
    
        
            
        
    
    

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

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

3. Запустите Liquibase С пружинным бобом

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

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

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

4. Используйте Liquibase С Пружинным Загрузчиком

Если мы используем Spring Boot , нет необходимости определять bean для Liquibase, но нам все равно нужно убедиться, что мы добавили зависимость liquibase-core.

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

Мы можем изменить файл журнала изменений по умолчанию, используя свойство ” liquibase.changelog “, например:

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

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

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

Самый простой вариант, который у нас есть, – это использовать spring.liquibase.enabled свойство . Таким образом, вся оставшаяся конфигурация Liquibase остается нетронутой.

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

spring.liquibase.enabled=false

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

liquibase.enabled=false

6. Создайте список изменений с помощью плагина 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. Создание списка изменений Из Существующей базы данных

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

mvn liquibase:generateChangeLog

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

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 из различий между двумя существующими базами данных (например, разработка и производство):

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=

А вот фрагмент сгенерированного Списка изменений :



    
        
    

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

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

Если приложение использует Hibernate – мы рассмотрим очень полезный способ создания Журнала изменений , который является плагином liquibase-hibernate .

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 на основе различий между существующей базой данных (например, производственной) и нашими новыми объектами сохранения.

Поэтому – чтобы упростить задачу – как только объект будет изменен, мы можем просто сгенерировать изменения в старой схеме БД, получив чистый, мощный способ развития нашей схемы в производстве .

Вот свойства 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

Обратите внимание, что URL-адрес reference использует пакеты can, поэтому параметр dialect является обязательным.

8. Создайте список изменений в IntelliJ IDEA с помощью плагина JPA Buddy

Если мы используем не спящий режим ORM (например, EclipseLink или OpenJPA) или не хотим добавлять дополнительные зависимости, такие как плагин liquibase-hibernate , мы можем использовать JPA Buddy . Этот плагин IntelliJ IDEA интегрирует полезные функции Liquibase в IDE.

Чтобы создать дифференциальный Список изменений, просто установите плагин, а затем вызовите действие из панели структуры JPA. Выберите, какой источник вы хотите сравнить (база данных, объекты JPA или снимок Liquibase) с какой целью (база данных или снимок Liquibase).

JPA Buddy сгенерирует Список изменений как показано в анимации ниже:

Еще одним преимуществом JPA Buddy перед плагином liquibase-hibernate является возможность переопределять сопоставления по умолчанию между типами Java и базами данных. Кроме того, он корректно работает с пользовательскими типами Hibernate и конвертерами JPA.

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

В этой статье мы проиллюстрировали несколько способов использования Liquibase и перехода к безопасному и зрелому способу разработки и рефакторинга схемы БД Java-приложения .

Реализация всех этих примеров и фрагментов кода доступна на GitHub .