web-dev-qa-db-ja.com

Spring Bootプロパティファイルを使用してFlyway 'baselineOnMigrate'および 'baselineVersion'を設定する

Spring BootのFlywayProperties.Javaは、Flyway設定の多くをサポートしていますが、「baselineVersion」または「baselineOnMigrate」はサポートしていません。既存のアプリケーションをFlywayに変換していますが、これらの設定はこの目的のために設計されているようです。私たちの運用環境は高度に制御されており、これを実現するためにそこでフライウェイのコマンドラインバージョンを実行することは現実的ではありません。

ここでカスタムFlyway @Beanを作成する唯一のオプションですか?

13
dropofahat

_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
_
13
Marco Schulte

それは無理だ。今日は、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プロファイルがあります。データベースをクリーンアップしないデフォルトと、データベースを完全にクリーンアップするデフォルト。とても便利な。

9
goroncy

FlywayMigrationStrategyを使用して成功しました。

@Component
public class BaselineOnMigrateMigrationStrategy implements FlywayMigrationStrategy {
    @Override
    public void migrate(Flyway flyway) {
        flyway.setBaselineOnMigrate(true);
        flyway.migrate();
    }
}
8
Seth

application.propertiesファイルで使用できますが、この回答コメントでマークされている@pdemのようなspringboot 2の場合は、spring.プレフィックスを追加する必要があります https://stackoverflow.com/a/ 39244097/273119

spring.flyway.baseline-on-migrate = true

6

フライウェイを使用しています5.1.4、これらをapplication.properties機能しましたflyway.enabled = true flyway.baseline-on-migrate = true

2
mc20

ソースを掘り下げて実験を行った後、setBaselineVersion()がFlywayクラスでオーバーロードされているため、Springがプロパティ値を挿入できないように見えます。

flyway.baselineVersionAsString= 2に変更すると、必要に応じて機能します。

0
dropofahat