使用 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之启动时设置默认配置文件属性