#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-скрипты с именами файлов жесткого кода, которые должны выполняться только в тестовом режиме.