使用spring boot属性文件设置Flyway'baselineOnMigrate'和'baselineVersion'

dro*_*hat 10 flyway spring-boot

Spring Boot的FlywayProperties.java支持许多Flyway设置,但不支持'baselineVersion'或'baselineOnMigrate'.我正在将现有的应用程序转换为Flyway,这些设置似乎是为此目的而设计的.我们的生产环境受到高度控制,并在那里运行一个命令行版本的flyway来实现这一点是不切实际的.

创建自定义Flyway @Bean是唯一的选择吗?

小智 12

您可以设置任何飞行路线的属性与被前缀他们flyway在你的application.yml/.properties.

它可以通过org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayConfiguration#flyway注释来实现@ConfigurationProperties(prefix = "flyway").

如果您使用的是application.yml添加以下内容:

flyway:
    baselineOnMigrate: true
Run Code Online (Sandbox Code Playgroud)

如果使用application.properties添加以下内容:

flyway.baselineOnMigrate = true
Run Code Online (Sandbox Code Playgroud)

  • 在spring boot 2中,前缀为"spring.flyway",因此属性为`spring.flyway.baselineOnMigrate = true` (14认同)
  • `baselineOnMigrate` 到底是做什么的? (5认同)

gor*_*ncy 9

是不可能的.我今天花了一些时间分析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;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我在这里有两个Spring配置文件.一个默认情况下不会清理数据库,另一个默认情况下会清理数据库.非常便利.


小智 7

我成功使用了FlywayMigrationStrategy.

@Component
public class BaselineOnMigrateMigrationStrategy implements FlywayMigrationStrategy {
    @Override
    public void migrate(Flyway flyway) {
        flyway.setBaselineOnMigrate(true);
        flyway.migrate();
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ico 7

您可以使用 onapplication.properties文件,但您需要spring.为 springboot 2添加前缀,例如在此答案注释中标记的 @pdem /sf/answers/2747086821/

spring.flyway.baseline-on-migrate=true