Liquibase changeSet с runAl всегда не выполняется liquibase.update - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь перезагрузить данные из файла .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, но его нет.

До сих пор я не смог точно определить причину проблемы, в журналах ничего не отображается после завершения метода.

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

1 Ответ

0 голосов
/ 21 января 2020

Список изменений, который вы определили в Application.properties, действителен только для контекста prod, но вы вызвали liquibase в неконтекстном режиме:

spring.liquibase.contexts=prod

Так что либо удалите запись в свойствах подать или предоставить его ликвидасе:

 liquibase.update(new Contexts("prod), new LabelExpression());
...