我正在尝试将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运行数据库供应商特定的脚本,具体取决于在数据源中设置的数据库。这就是我得到的:
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。对我没有任何帮助。
答案 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)
您可能需要将文件夹名称小写,即H2
至h2
和MySQL
至mysql
,以使其起作用。
或者,考虑使用Spring Boots Flyway自动配置,而不是使用代码对Flyway配置进行编码。这使您可以在应用程序配置中将路径定义为:
spring.flyway.locations=classpath:db/migration/{vendor}
{vendor}
将自动填充用于连接的驱动程序的供应商名称。