FlyWay + Spring Boot 2.x for vendor specific scripts error: found more than one migration with version 1.x

FlyWay + Spring Boot 2.x for vendor specific scripts error: found more than one migration with version 1.x

我正在尝试将 FlyWay 配置为与两家供应商合作 - 一家 (H2) 用于本地环境,另一家 (Mysql) 用于 ci。

这是我的脚本补丁:

我的 FlyWay bean 配置:

@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();
    }

还有我的application.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 运行 数据库供应商 specific 脚本,具体取决于数据源中设置的数据库。这是我得到的:

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/migration/mysql ...) 并使用 db/specific/ 而不是 db/migration。对我没有任何作用。

问题是您使用了:

.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)

您可能需要将文件夹名称小写,即 H2h2MySQLmysql 才能工作。

或者,考虑使用 Spring Boots Flyway 自动配置,而不是在代码中编写 Flyway 配置。这允许您将应用程序配置中的路径定义为:

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

其中 {vendor} 将自动填充用于连接的驱动程序的供应商名称。

另见 Execute Flyway Database Migrations on Startup