миграции flyway, не работающие с базой данных H2 из-за ошибки в инструкции sql для чтения данных из flyway_schema_history

#h2 #flyway

#h2 #flyway

Вопрос:

Во время тестирования я пытаюсь выполнить свои миграции flyway в базе данных H2 в памяти. Но даже вызов flyway.baseline() завершается ошибкой с сообщением об ошибке:

 Caused by: org.h2.jdbc.JdbcSQLException: Tabelle "flyway_schema_history" nicht gefunden
Table "flyway_schema_history" not found; SQL statement:
SELECT "installed_rank","version","description","type","script","checksum","installed_on","installed_by","execution_time","success" FROM "PUBLIC"."flyway_schema_history" WHERE "installed_rank" > -1 ORDER BY "installed_rank" [42102-197]
  

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

Теперь мне интересно, почему это происходит.

Я использую flyway из приложения spring boot. Это моя конфигурация для тестирования:

 spring:   datasource:
    url: jdbc:h2:./testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;trace_level_file=3;trace_level_system_out=3
    driver_class_name: org.h2.Driver
    username: sa
    password: sa   jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        show_sql: true
        format_sql: true

  flyway:
      locations: filesystem:sql
      cleanDisabled: true
      baselineVersion: "19700101.001"
      outOfOrder: true
      table: flyway_schema_history
  

Я вызываю миграции в своих тестах следующим образом:

 @Bean
@Profile("test")
public FlywayMigrationStrategy actuallyExecuteTheMigrations() {
    return new FlywayMigrationStrategy() {
        @Override
        public void migrate(Flyway flyway) {
            // start the H2 server during the test phase, so we have a chance to inspect the database
            try {
                startH2Server();
                startH2WebServer();
            } catch (Exception e) {
                logger.warn("Failure starting H2 server, probably it's already running");
            }
            DataSource dataSource = flyway.getConfiguration().getDataSource();
            try {
                Connection connection = dataSource.getConnection();
                Statement statement = connection.createStatement();
                statement.execute(FileUtils.readFileToString(new File("sql/T20190219_100__special_script_for_test_evironment.sql"), Charset.forName("UTF-8")));
                connection.commit();
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
            }
            flyway.baseline();
            flyway.migrate();
        }
    };

}
  

Поскольку я хочу выполнить некоторые специальные настройки в базе данных только для тестирования, я выполняю специальный SQL-скрипт перед вызовом flyway.migrate().

Комментарии:

1. Почему вы делаете это самостоятельно? Весенний загрузочный тест уже запускает flyway для вас

2. Я отредактировал вопрос, потому что я опустил части кода, где я выполняю некоторые дополнительные SQL-скрипты с именами файлов жесткого кода, которые должны выполняться только в тестовом режиме.