Правильный способ добавить жидкость в существующий весенний загрузочный проект - PullRequest
0 голосов
/ 22 января 2019

У меня есть существующий проект весенней загрузки и база данных для него. Теперь я хотел бы добавить 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 для запуска только тех изменений, которые еще не были выполнены?

1 Ответ

0 голосов
/ 22 января 2019

MySQL будет вести журнал для liquibase в таблице,

Liquibase использует таблицу DATABASECHANGELOG, чтобы отслеживать, какие наборы изменений были запущены.

При каждом запуске журнала изменений для каждого журнала изменений будет одна строкадобавьте таблицу, основываясь на идентификаторах, которые мы можем знать, какие журналы изменений запускаются,

Есть некоторые флаги, такие как runAlways, runOnChange, они помогут нам выполнять / не выполнять.

Вы можете обратиться к:

For understanding flags:

https://www.liquibase.org/documentation/changeset.html

For understanding DATABASECHANGELOG Table: 

https://www.liquibase.org/documentation/databasechangelog_table.html

...