18

首先,一点背景。我有一组 Java 应用程序,有些基于 JPA,有些则不是。为了创建我的数据库,我目前正在使用 Hibernates 模式导出来为使用 JPA 的用户生成创建脚本。那些不使用 JPA 的我手动生成脚本。然后在使用 ANT 安装应用程序期间运行这些。对于更新,应用程序安装程序只需将更新脚本应用于数据库。

为了改进数据库更新的管理,我一直在研究 Flyway 和 Liquibase。两者似乎几乎都在做我想做的事(除此之外:我现在更喜欢 Flyway,因为我们拥有所有预先存在的 SQL/DDL 脚本)。我可以看到的问题是它们都直接更新数据库。这对于很多安装都很好,但不是全部。

我想做的是针对数据库运行 Flyway/Liquibase 并生成一个更新脚本,其中包含使数据库保持最新状态所需的所有更新 - 包括 Flyway/Liquibase 需要对其自己的表进行的任何更改。这将允许我(或更重要的是数据库管理员)在应用程序之外运行更新脚本来更新数据库。然后我可以在我的应用程序中使用 Flyway/Liquibase 来验证数据库是否是最新的。

是否可以使用 Flyway 或 Liquibase 或任何其他工具来做到这一点?

4

5 回答 5

12

Liquibase 处理得很好。它在当前状态下查看您的数据库,找到未应用的变更集并在sql output mode 下生成带有update命令的 SQL 脚本。

无论如何,使用适当的数据库迁移工具而不是 Hibernate 生成器是要走的路,迟早你会遇到 Hibernate 不支持的情况。对我们来说,它正在删除一个唯一索引并用另一个索引替换它。您还可以hibernate.hbm2ddl.auto=validate对数据库结构和实体 bean 之间的兼容性感到安全。

于 2013-01-23T15:23:55.050 回答
7

当我在一家咨询公司(Intelliware)工作时,我们遇到了类似的问题,所以那里的开发人员将一些代码放在一起并将其推送到 GitHub。

我们尝试将其包含在 Flyway 核心存储库中,但没有成功。

https://github.com/Intelliware/flyway-script-generator

于 2016-08-12T19:53:52.400 回答
4

你想要的是一个模式差异工具。我记得听说 TOAD 有一个相当强大的功能。Hibernate 还将尝试根据它检测到的实体和数据库元数据生成模式更新脚本。

但是,您需要的是……不要这样做,而是使用 Flyway 进行所有数据库更改。也就是说,您应该关闭 Hibernates 自动模式更新并自己编写模式更新。每次要更改数据库时,都必须编写模式更新。

有些人捕获了休眠模式更新的 SQL 输出,作为获取自动模式演变更新的一种方式。问题是休眠通常是错误的,尤其是在添加@NotNull列时。

同样就您的管理员而言,我相信 Flyway 可以根据其 schema_version 表和 SQL/Java 迁移脚本输出它将运行的 SQL 输出,因此您的 DBA 可以在 Flyway 之外运行它(如果不是,这将是一个简单的功能加上)。

于 2013-01-23T15:13:34.353 回答
3

是的,生成 SQL 脚本是 Liquibase 的内置功能。Liquibase 比 flyway 具有优势的另一个领域是它能够迁移数据库代码更改(包、过程和函数)。我使用 flyway,但我希望在 flyway 中提供这些 Liquibase 功能。

于 2013-01-29T18:40:44.397 回答
2

Flyway 命令行工具的文档说这dryRunOutput是 Flyway Pro 的一项功能,可将 SQL 语句输出到指定文件。

于 2018-05-19T20:07:50.803 回答