使用 Spring Boot 属性文件设置 Flyway 'baselineOnMigrate' 和 'baselineVersion'

Posted

技术标签:

【中文标题】使用 Spring Boot 属性文件设置 Flyway \'baselineOnMigrate\' 和 \'baselineVersion\'【英文标题】: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 是这里唯一的选择吗?

【问题讨论】:

【参考方案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://***.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 可以正常工作。

【讨论】:

以上是关于使用 Spring Boot 属性文件设置 Flyway 'baselineOnMigrate' 和 'baselineVersion'的主要内容,如果未能解决你的问题,请参考以下文章

spring boot importsource怎么设置加载顺序

(013)Spring Boot之启动时设置默认配置文件属性

使用spring boot创建分层属性文件

Spring Cloud Spring Boot mybatis分布式微服务云架构属性配置文件详解

Spring Boot如何在属性文件中隐藏密码

未读取junit spring boot配置文件属性