FlyWay + Spring Boot 2.x для скриптов, специфичных для поставщика: обнаружено несколько миграций с версией 1.x - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь настроить FlyWay для работы с двумя поставщиками - один (H2) для локальной среды, а другой (Mysql) для ci.

Вот мой патч сценариев:

patch

Моя конфигурация bean-компонента FlyWay:

@Bean(initMethod = "migrate")
    Flyway flyway() {
        Flyway flyway = Flyway
                .configure()
                .dataSource(dataSource(dataSourceProperties()))
                .locations("classpath:db/migration/MySQL", "classpath:db/migration/H2")
                .load();
        return flyway;
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("spring.datasource")
    public HikariDataSource dataSource(DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().type(HikariDataSource.class)
                .build();
    }

И мое приложение.Конфигурация yml:

spring:
  main:
    allow-bean-definition-overriding: true
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbc-url: jdbc:mysql://localhost:3306/messages
    username: username
    password: password

Я пытаюсь добиться того, чтобы заставить flyway запускать сценарии, специфичные для поставщика базы данных, в зависимости от того, какая база данных установлена ​​в источнике данных.Вот что я получаю:

Caused by: org.flywaydb.core.api.FlywayException: Found more than one migration with version 1.1
Offenders:
-> C:\Projects\my-project\out\production\resources\db\specific\MySQL\V1_1__Create_table_message.sql (SQL)
-> C:\Projects\my-project\out\production\resources\db\specific\H2\V1_1__Create_table_message.sql (SQL)

Я уже пытался использовать имена поставщиков в нижнем регистре (db /igration / mysql ...) и использовать db / specific / вместо db /igration.У меня ничего не получалось.

1 Ответ

0 голосов
/ 31 января 2019

Проблема заключается в том, что вы используете:

.locations("classpath:db/migration/MySQL", "classpath:db/migration/H2")

Это добавит обе миграции к пути выполнения.Это то, что вызывает проблему, потому что эта конфигурация инструктирует flyway всегда использовать сценарии из обоих мест, вместо того, чтобы использовать только сценарии H2 для H2 и сценарии MySQL для MySQL.

Вместо этого следует добавить толькоконкретный путь для активного драйвера на пути.

Что-то вроде

String driverVendor = ..; // something to decide h2 or mysql
Flyway flyway = Flyway
        .configure()
        .locations("classpath:db/migration/" + driverVendor)

Возможно, вам потребуется указать имена папок в нижнем регистре, то есть от H2 до h2 и MySQLна mysql, чтобы это работало.

В качестве альтернативы рассмотрите возможность использования автоконфигурации Spring Boots Flyway вместо кодирования конфигурации Flyway в коде.Это позволяет определить путь в конфигурации приложения следующим образом:

spring.flyway.locations=classpath:db/migration/{vendor}

Где {vendor} будет автоматически заполнено именем поставщика драйвера, используемого для подключения.

См. Также Выполнить миграцию базы данных Flyway при запуске

...