【问题标题】:Setting Flyway 'baselineOnMigrate' and 'baselineVersion' using spring boot property file使用 Spring Boot 属性文件设置 Flyway 'baselineOnMigrate' 和 'baselineVersion'
【发布时间】:2016-01-06 20:58:14
【问题描述】:

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

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

【问题讨论】:

    标签: spring-boot flyway


    【解决方案1】:

    您可以在您的application.yml/.properties 中设置任何 飞行方式属性,并在它们前面加上flyway

    org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayConfiguration#flyway 使之成为可能,@ConfigurationProperties(prefix = "flyway") 注释。

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

    flyway:
        baselineOnMigrate: true
    

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

    flyway.baselineOnMigrate = true
    

    【讨论】:

    • 在spring boot 2中前缀是“spring.flyway”,所以属性是spring.flyway.baselineOnMigrate = true
    • baselineOnMigrate 到底是做什么的?
    • spring.flyway.baseline-on-migrate=true 由 intellij idea 自动完成建议。
    【解决方案2】:

    这是不可能的。我今天花了一些时间分析 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;
    }
    

    如您所见,我在这里有两个 Spring 配置文件。一种默认不会清理您的数据库,另一种是完全清理数据库。非常便利。

    【讨论】:

    • 感谢@goroncy 证实了我的怀疑。
    【解决方案3】:

    我使用 FlywayMigrationStrategy 取得了成功。

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

    【讨论】:

      【解决方案4】:

      您可以在application.properties 文件上使用,但您需要为springboot 2 添加spring. 前缀,如此答案cmets https://stackoverflow.com/a/39244097/273119 中标记的@pdem。

      spring.flyway.baseline-on-migrate=true

      【讨论】:

        【解决方案5】:

        我正在使用 flyway 5.1.4,对我来说,将这些添加到 application.properties 工作 flyway.enabled = true flyway.baseline-on-migrate = true

        【讨论】:

          【解决方案6】:

          在挖掘源码并进行了一些实验后,似乎是因为 setBaselineVersion() 在 Flyway 类中被重载,Spring 无法注入属性值。

          更改为 flyway.baselineVersionAsString=2 可以正常工作。

          【讨论】:

            猜你喜欢
            • 2019-07-05
            • 2017-10-26
            • 2015-11-21
            • 1970-01-01
            • 2019-01-11
            • 2017-10-11
            • 1970-01-01
            • 2017-11-06
            • 2018-03-01
            相关资源
            最近更新 更多