миграция flyway не работает с базой данных H2 из-за ошибки в выражении sql для чтения данных из flyway_schema_history - PullRequest
0 голосов
/ 11 марта 2019

Во время тестирования я пытаюсь выполнить миграцию с моего пролета на базе данных 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:   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 ().

...