Я пытаюсь перезагрузить данные из файла .csv, используя атрибут runAlways="true"
. Моя цель - переписать (обновить) версию приложения, прочитанную из файла app_version.csv
, если значение изменилось. Если изменено, я использую Liquibase API для запуска liquibase.update(..)
, который должен вызвать набор изменений, содержащий раздел.
My pom. xml:
...
<!-- Persistance DEPS -->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
<dependency>
<groupId>org.liquibase.ext</groupId>
<artifactId>liquibase-hibernate5</artifactId>
<version>3.6</version>
</dependency>
...
Application.properties:
spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.xml
spring.liquibase.contexts=prod
spring.liquibase.enabled=true
# H2
spring.datasource.url=jdbc:h2:file:~/author-db/testdb
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
Таблица БД global_settings
(в данный момент используется H2 в файле, pk = "id"):
ID | APP_KEY | APP_VALUE | CREATED_BY | CREATED_DATE | LAST_MODIFIED_BY | LAST_MODIFIED_DATE
1 app-version 4.3.3-SNAPSHOT system 2020-01-21 16:11:10.009 system null
Файл. xml, содержащий набор изменений:
<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
<changeSet id="app_version" author="author">
<loadData file="db/app_version.csv" separator=";"
tableName="global_settings">
<column name="id" type="numeric"/>
<column name="created_date" type="timestamp"/>
<column name="last_modified_date" type="timestamp"/>
</loadData>
</changeSet>
<changeSet id="update_app_version" author="author" runAlways="true">
<loadUpdateData file="db/app_version.csv" separator=";" tableName="global_settings"
primaryKey="id">
<column name="id" type="numeric"/>
<column name="created_date" type="timestamp"/>
<column name="last_modified_date" type="timestamp"/>
</loadUpdateData>
</changeSet>
</databaseChangeLog>
Содержимое файла app_version.csv
:
id;app_key;app_value;created_by;last_modified_by
1;app-version;@project.version@;system;system
Java код, используемый для запуска:
inside main spring boot class
...
Optional<GlobalSettings> appSettings = globalSettingsRepository.findOneByAppKey("app-version"); --> value = 4.3.3-SNAPSHOT
appSettings.get().setValue("4.3.2"); --> value = 4.3.2
globalSettingsRepository.save(appSettings.get());
runLiquibaseUpdate(); --> value = 4.3.2
--------------
public void runLiquibaseUpdate() {
Database database;
Connection connection;
Liquibase liquibase;
try {
connection = DriverManager.getConnection(env.getProperty("spring.datasource.url"),
env.getProperty("spring.datasource.username"),
env.getProperty("spring.datasource.password"));
database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));
DatabaseChangeLog changeLog = new DatabaseChangeLog(env.getProperty("spring.liquibase.change-log"));
liquibase = new Liquibase(changeLog, new FileSystemResourceAccessor(), database);
liquibase.update(new Contexts(), new LabelExpression());
} catch (SQLException | LiquibaseException e) {
e.printStackTrace();
}
}
Мое намерение было таким: first changeSet (id = " app_version ") загружает данные из файла .csv, работает. После запуска метода runLiquibaseUpdate
, насколько я понимаю (пожалуйста, исправьте меня, если я ошибаюсь), он должен вызвать changeSet (id = "update_app_version") из-за runAlways="true"
, а значение в базе данных должно измениться на исходное значение найдено в файле .csv, но его нет.
До сих пор я не смог точно определить причину проблемы, в журналах ничего не отображается после завершения метода.
Если мое понимание неверно и это невозможно, я прошу совета, как этого добиться.