У меня есть существующий проект весенней загрузки и база данных для него. Теперь я хотел бы добавить liquibase для дальнейшей миграции базы данных. Как правильно это сделать?
Я следовал этой статье , чтобы добавить жидкость и создать список изменений. Большинство статей, о которых я узнал, говорят об использовании жидкости в проекте, начинающемся с нуля, или не слишком подробно описывают реализацию. Пока что я сделал следующее:
Добавлены зависимости и плагин в pom.xml
<dependencies>
//..other dependencies
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.6.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.6.2</version>
<configuration>
<propertyFile>src/main/resources/liquibase.properties</propertyFile>
</configuration>
</plugin>
</plugins>
</build>
Добавлен файл liquibase.properties в каталоге src / main / resources
url=jdbc:mysql://localhost:3306/demodb
username=root
password=root
driver=com.mysql.jdbc.Driver
outputChangeLogFile=src/main/resources/db/changelog/changes/demodb-changelog.xml
Обновлен файл application.properties в каталоге src / main / resources для обработки журналов изменений
#Hibernate
spring.datasource.url=jdbc:mysql://localhost:3306/demodb
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root
#Jpa
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
#Liquibase
spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.xml
Создал файл db.changelog-master.xml
в src / main / resources / db / changelog
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.liquibase.org/xml/ns/dbchangelog/1.9
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd">
</databaseChangeLog>
Запустил приложение весенней загрузки, чтобы в базе данных были созданы две новые таблицы - DATABASECHANGELOG
(которая в данный момент пуста) и DATABASECHANGELOGLOCK
(которая в данный момент имеет одну нулевую запись)
Сгенерировал файл demodb-changelog.xml
из терминала для создания журнала изменений для текущего состояния базы данных
mvn liquibase:generateChangeLog
Затем, чтобы синхронизировать текущие журналы изменений как выполненные, в liquibase.properties
добавлено:
changeLogFile=src/main/resources/db/changelog/changes/demodb-changelog.xml
А потом из терминала побежали:
mvn liquibase:changelogSync
Теперь в таблице DATABASECHANGELOG
есть записи для журналов изменений как выполненные.
Далее в файле db.changelog-master.xml
добавлен сгенерированный файл:
<include file="db/changelog/changes/demodb-changelog.xml"/>
Теперь, когда я запускаю приложение, я получаю исключение:
Caused by: liquibase.exception.MigrationFailedException:
Migration failed for change set db/changelog/changes/demodb-changelog.xml
Reason: liquibase.exception.DatabaseException: Table 'abc' already exists
Итак, он пытается снова запустить файлы изменений. Как мне настроить запуск только тех наборов изменений, которые еще не были запущены? Я думал, что функция DATABASECHANGELOG
заключается в обработке выполненных наборов изменений, но, думаю, я здесь не прав.
Я мог бы запустить приложение без тега include
в db.changelog-master.xml
, но я думаю, что все файлы журнала изменений должны быть перечислены здесь, так как мне понадобятся все файлы журнала изменений, если бы я запускал это приложение на другом компьютере создать всю базу данных с нуля.
Так как настроить liquibase для запуска только тех изменений, которые еще не были выполнены?