Flyway 或 Liquibase 可以生成更新脚本而不是直接更新数据库吗?
Posted
技术标签:
【中文标题】Flyway 或 Liquibase 可以生成更新脚本而不是直接更新数据库吗?【英文标题】:Can Flyway or Liquibase generate an update script instead of updating the database directly? 【发布时间】:2013-01-07 02:31:32 【问题描述】:首先,有一点背景。我有一组 Java 应用程序,有些基于 JPA,有些则不是。为了创建我的数据库,我目前正在使用 Hibernates 模式导出来为使用 JPA 的用户生成创建脚本。那些不使用 JPA 的我手动生成脚本。然后在使用 ANT 安装应用程序期间运行这些。对于更新,应用程序安装程序只需将更新脚本应用于数据库。
为了改进对数据库更新的管理,我一直在研究 Flyway 和 Liquibase。两者似乎几乎都在做我想做的事(除此之外:我现在更喜欢 Flyway,因为我们拥有所有预先存在的 SQL/DDL 脚本)。我可以看到的问题是它们都直接更新数据库。这对于很多安装都很好,但不是全部。
我想做的是针对数据库运行 Flyway/Liquibase 并生成一个更新脚本,其中包含使数据库保持最新所需的所有更新 - 包括 Flyway/Liquibase 需要对其自己的表进行的任何更改。这将允许我(或更重要的是数据库管理员)在应用程序之外运行更新脚本来更新数据库。然后我可以在我的应用程序中使用 Flyway/Liquibase 来验证数据库是否是最新的。
是否可以使用 Flyway 或 Liquibase 或任何其他工具来执行此操作?
【问题讨论】:
我最喜欢的 liquibase 功能之一是它能够生成 SQL 脚本。我将此与拒绝我访问的偏执 DBA 一起使用 :-) 有关演示,请参阅:***.com/questions/8397488/… 【参考方案1】:Liquibase 处理得很好。它在当前状态下查看您的数据库,找到未应用的变更集并在sql output mode 中使用update
命令生成一个SQL 脚本。
使用适当的数据库迁移工具而不是 Hibernate 生成器是无论如何都要走的路,迟早您会遇到 Hibernate 不支持的情况。对我们来说,它正在删除一个唯一索引并用另一个索引替换它。您还可以启用hibernate.hbm2ddl.auto=validate
以放心地了解数据库结构和实体 bean 之间的兼容性。
【讨论】:
谢谢。 SQL 输出功能在文档中非常清楚 - 不知道我为什么错过它。 使用 liquibase-hibernate 扩展,您可以直接从更改的休眠实体生成变更集。【参考方案2】:当我在一家咨询公司(Intelliware)工作时,我们遇到了类似的问题,所以那里的开发人员整理了一些代码并将其推送到 GitHub。
我们尝试将其包含在 Flyway 核心存储库中,但未成功。
https://github.com/Intelliware/flyway-script-generator
【讨论】:
【参考方案3】:您需要的是架构差异工具。我记得听说 TOAD 有一个相当强大的功能。 Hibernate 还将尝试根据它检测到的实体和数据库元数据生成架构更新脚本。
但是您需要...不要这样做,而是使用 Flyway 进行所有数据库更改。也就是说,您应该关闭 Hibernates 自动模式更新并自己编写模式更新。每次您想要更改数据库时,您都必须编写架构更新。
有些人将休眠模式更新的 SQL 输出捕获为获取自动模式演变更新的一种方式。问题是休眠通常是错误的,尤其是在添加@NotNull
列时。
另外,就您的管理员而言,我相信 Flyway 可以根据其 schema_version 表和 SQL/Java 迁移脚本输出它将运行的 SQL 输出,因此您的 DBA 可以在 Flyway 之外运行它(如果不是这样的话一个易于添加的功能)。
【讨论】:
澄清一下,Flyway 不会产生 SQL 输出,它会立即针对数据库执行。但是,Flyway 命令行工具允许您在应用程序之外运行相同的迁移,并且应该可以很好地满足您的需求。 是的,但我可以理解为什么 DBA 可能希望在运行之前查看 Flyway 想要运行的 SQL。从理论上讲,您似乎可以让 Flyway 尝试进行架构更改然后回滚,或者甚至不执行命令......对吗?顺便说一句,我真的很喜欢 Flyway ......谢谢你的付出。【参考方案4】:是的,生成 SQL 脚本是 Liquibase 的内置功能。 Liquibase 比 flyway 具有优势的另一个领域是它能够迁移数据库代码更改(包、过程和函数)。我使用 flyway,但我希望在 flyway 中提供这些 Liquibase 功能。
【讨论】:
【参考方案5】:Flyway command line tool 的文档说 dryRunOutput
是 Flyway Pro 的一项功能,可将 SQL 语句输出到指定文件。
【讨论】:
以上是关于Flyway 或 Liquibase 可以生成更新脚本而不是直接更新数据库吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 liquibase/flyway 类似 Terraform 的自动更新数据库,可能吗?
Elasticsearch 的 Liquibase 或 Flyway 数据库迁移替代方案
Liquibase Autopick 可以像 Flyway 这样的新变更集文件吗?
Spring Boot学习总结(27)—— Spring Boot中两个数据库迁移工具Liquibase和Flyway的比较