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)
您可能需要将文件夹名称小写,即 H2
到 h2
和 MySQL
到 mysql
才能工作。
或者,考虑使用 Spring Boots Flyway 自动配置,而不是在代码中编写 Flyway 配置。这允许您将应用程序配置中的路径定义为:
spring.flyway.locations=classpath:db/migration/{vendor}
其中 {vendor}
将自动填充用于连接的驱动程序的供应商名称。
我正在尝试将 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)
您可能需要将文件夹名称小写,即 H2
到 h2
和 MySQL
到 mysql
才能工作。
或者,考虑使用 Spring Boots Flyway 自动配置,而不是在代码中编写 Flyway 配置。这允许您将应用程序配置中的路径定义为:
spring.flyway.locations=classpath:db/migration/{vendor}
其中 {vendor}
将自动填充用于连接的驱动程序的供应商名称。