针对供应商特定脚本的FlyWay + Spring Boot 2.x错误:使用1.x版发现了多个迁移

时间:2019-01-31 12:01:42

标签: java spring-boot flyway

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

这是我的脚本补丁:

patch

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

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

我已经尝试使用小写的供应商名称(db / migration / mysql ...),并使用db / specific /代替db / migration。对我没有任何帮助。

1 个答案:

答案 0 :(得分:4)

问题在于您对以下内容的使用:

.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