【发布时间】:2020-08-05 11:20:18
【问题描述】:
我有一个 Spring Boot 应用程序,它使用 Flyway 在 Postgres 中进行数据库迁移。
现在大约 4 岁了,所以我们说的是 Flyway 4.0.3、Spring Boot 1.3.x 和 Postgres 9.x。版本可能会升级,但我想在此之前修复任何现有问题。
与此同时,Postgres 已升级到高于 9.x 的版本。不幸的是,一些现有的迁移已经过时,因为它们包含不推荐使用的语法。因此,现在使用新数据库(即在开发环境中)启动应用程序会导致这些迁移失败。在生产中这很好,因为这些迁移已经应用并且不会再次应用。
我很好奇在这方面的最佳做法是什么。我不能只修复现有迁移中的语法,因为这会导致生产环境中的校验和失败。我知道repair 是一个东西,但是我不确定它是如何工作的以及如何将它与 Spring Boot 一起使用。
失败的 SQL:
UPDATE config
SET (description) = 'my description'
WHERE ...
正确的 SQL:
UPDATE config
SET description = 'my description'
WHERE ...
错误:
Message : ERROR: source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression
编辑 2020 年 4 月 24 日 Spring Boot 解决方案:
Grant Fitchey 在下面发布了关于如何使用 repair 的正确答案后,我将具体说明我是如何使用 Spring Boot 做到这一点的。我刚刚创建了一个 FlywayMigrationStrategy 的 bean,它调用
repair 在它调用 migrate 之前:
@Bean
public FlywayMigrationStrategy cleanMigrateStrategy() {
return flyway -> {
flyway.repair();
flyway.migrate();
};
}
将其部署到生产环境时,在启动期间,Postgres 中 schema_versions 表中的校验和已修复。在另一个版本中,我将再次删除 flyway.repair(); 行,否则显然这会产生应用无效迁移的风险。
【问题讨论】:
-
您能举一些迁移失败的例子吗?不推荐使用的语法不应导致错误.....
-
我已经编辑了我的问题@CodeScale
标签: postgresql spring-boot database-migration flyway