RichardK:
私は2つのベンダーとの仕事にフライウェイを設定しようとしている - 1(H2)は、ローカル環境用で、もう1(MySQLは)、CIのためです。
ここに私のスクリプトのパッチです:
私のフライウェイ豆の設定:
@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
私は何を達成しようとすると、データソースに設定されているデータベースに応じて、フライウェイ実行データベースベンダー固有のスクリプトを作ることです。ここで私は何を得るのです。
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)
私はすでに小文字のベンダ名(デシベル/移動/ mysqlの...)と使用デシベル/特定/の代わりに、DB /移行を使用しようとしました。何も私のために働きました。
マークRotteveel:
問題は、あなたの使用であります:
.locations("classpath:db/migration/MySQL", "classpath:db/migration/H2")
これは、実行時のパスに両方の移行を追加します。これは、この設定指示する代わりに、常に唯一のH2とMySQLのMySQLスクリプトのH2-スクリプトを使用しての、両方の場所からスクリプトを使用するフライウェイので、問題を引き起こすものです。
代わりに、あなただけのパス上のアクティブドライバのための特定のパスを追加する必要があります。
何かのようなもの
String driverVendor = ..; // something to decide h2 or mysql
Flyway flyway = Flyway
.configure()
.locations("classpath:db/migration/" + driverVendor)
あなたは、フォルダ名を小文字する必要があることはあるH2
にh2
してMySQL
までmysql
仕事に、このために。
また、春ブーツフライウェイの自動設定を使用する代わりに、コード内のフライウェイ構成を符号化することを検討してください。これにより、アプリケーションの設定などで、パスを定義することができます:
spring.flyway.locations=classpath:db/migration/{vendor}
どこに{vendor}
自動的に接続するために使用されるドライバのベンダー名が移入されます。
参照してください起動時にフライウェイのデータベースマイグレーションを実行します