【发布时间】:2019-02-06 14:41:36
【问题描述】:
我正在使用 Flyway 更新数据库架构。目前最新版本的schema是3(最新的迁移文件名为V3__postgres.sql)。
如果我在具有旧架构版本的数据库上运行应用程序,Flyway 会按预期执行更新脚本。但是,如果我在新的(空)数据库上运行应用程序,flyway 会尝试执行更新脚本,但它没有找到任何表(因为 Hibernate 尚未创建它们),并且应用程序因错误而终止。
我希望 Flyway不在空数据库上执行更新脚本,因为当 Hibernate 创建表时,它们无论如何都会是最新版本。
如果我理解正确,我应该可以为此使用参数flyway.baseline-version。我的理论是,如果 Flyway 没有找到表 schema_version,它应该创建它并插入一条记录,说明数据库是版本 3。但即使我设置了 flyway.baseline-version=3,Flyway 仍然会执行脚本。我还尝试设置参数flyway.baseline-on-migrate=true 及其不同的组合,但我无法让它工作。
我是否正确理解了baseline-version 参数,还是我遗漏了什么?
注意:我知道自 Spring Boot 2 起参数命名空间已更改为 spring.flyway.*,但我使用的是 Spring Boot 1,所以这不是问题。
【问题讨论】:
-
这里的主要问题是您有两种相互竞争的机制来管理您的数据库模式。这就是给你带来麻烦的原因。同样让 Hibernate 创建(并因此管理)您的架构在生产中通常是一个坏主意(您的架构(键、索引等)也可能与使用 flyway 的架构不同)。
-
就像@M.Deinum 所说的那样,不要让Hibernate 创建表。我们使用诸如 V0_1__Tables.sql、V0_2__Sequences.sql、V03__Data.sql 之类的 Flyway 脚本来初始设置必要的数据库对象并填充它们,然后使用 1 向上的版本来发展我们的数据库。
-
多年来,我们一直在多个项目和多个环境中使用 Hibernate 生成数据库结构,但从未遇到过问题。但是,虽然这种方法非常适合创建新内容(表、列、索引等),但它不能用于修改或删除现有内容。这就是我们开始使用 Flyway 的原因(用于修改现有结构)。如果我们开始完全通过 Flyway(即手动)管理模式,这将为我们带来更多的工作。使用 Flyway 的重点应该是让我们(开发人员)的生活更轻松,而不是更艰难......
标签: java hibernate spring-boot flyway