Spring BootのFlywayProperties.Javaは、Flyway設定の多くをサポートしていますが、「baselineVersion」または「baselineOnMigrate」はサポートしていません。既存のアプリケーションをFlywayに変換していますが、これらの設定はこの目的のために設計されているようです。私たちの運用環境は高度に制御されており、これを実現するためにそこでフライウェイのコマンドラインバージョンを実行することは現実的ではありません。
ここでカスタムFlyway @Beanを作成する唯一のオプションですか?
_application.yml/.properties
_でanyのフライウェイプロパティの前にflyway
を設定できます。
これは、@ConfigurationProperties(prefix = "flyway")
で注釈された_org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayConfiguration#flyway
_によって可能になります。
_application.yml
_を使用している場合は、以下を追加します。
_flyway:
baselineOnMigrate: true
_
_application.properties
_を使用する場合は、以下を追加します。
_flyway.baselineOnMigrate = true
_
それは無理だ。今日は、Spring Bootのコードを分析して、この問題の解決策を見つけることに少し時間を費やしました。 FlywayAutoConfigurationでこれらのプロパティを設定することについては何もありません。また、SpringがFlywayオブジェクトのconfigureメソッドを呼び出さないこともわかりました。flyway.propertiesが機能するための唯一の他のオプションは何ですか。 Springはflyway.propertiesを少し乱用しており、このファイルをFlywayに提供する代わりに、プロパティのソースとして使用します。これが、FlywayAutoConfigurationを使用するときに可能なオプションのセットが非常に制限されている理由です。したがって、Flywayのより高度な機能が必要な場合は、FlywayAutoConfigurationの使用は適切なオプションではありません。しかし、@ Beanの使用はここでは悲劇ではありません。以下に、@ Beanをこのように使用して、この動作を実装することが、プロパティファイルでは不可能になる例を示します。
@Profile(value = "!dbClean")
@Bean(name = "flyway", initMethod = "migrate")
public Flyway flywayNotADestroyer() {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource());
flyway.setBaselineOnMigrate(true);
return flyway;
}
@Profile(value = "dbClean")
@Bean(name = "flyway", initMethod = "migrate")
public Flyway flywayTheDestroyer() {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource());
flyway.setBaselineOnMigrate(true);
flyway.clean();
return flyway;
}
ご覧のとおり、ここには2つのSpringプロファイルがあります。データベースをクリーンアップしないデフォルトと、データベースを完全にクリーンアップするデフォルト。とても便利な。
FlywayMigrationStrategyを使用して成功しました。
@Component
public class BaselineOnMigrateMigrationStrategy implements FlywayMigrationStrategy {
@Override
public void migrate(Flyway flyway) {
flyway.setBaselineOnMigrate(true);
flyway.migrate();
}
}
application.properties
ファイルで使用できますが、この回答コメントでマークされている@pdemのようなspringboot 2の場合は、spring.
プレフィックスを追加する必要があります https://stackoverflow.com/a/ 39244097/273119 。
spring.flyway.baseline-on-migrate = true
フライウェイを使用しています5.1.4
、これらをapplication.properties
機能しましたflyway.enabled = true flyway.baseline-on-migrate = true
ソースを掘り下げて実験を行った後、setBaselineVersion()がFlywayクラスでオーバーロードされているため、Springがプロパティ値を挿入できないように見えます。
flyway.baselineVersionAsString= 2に変更すると、必要に応じて機能します。