Используйте 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.
Миграция базы данных с Flyway
В этой статье описываются ключевые концепции Flyway и то, как мы можем использовать эту структуру для постоянного и надежного изменения схемы базы данных нашего приложения.
Краткое руководство по загрузке исходных данных с помощью Spring Boot
Быстрый и практический пример использования файлов data.sql и schema.sql в Spring Boot.
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, поэтому его должно быть легко импортировать и запускать как есть.