Flyway或Liquibase可以生成更新脚本而不是直接更新数据库吗?

时间:2013-01-23 14:59:48

标签: hibernate jpa liquibase flyway

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

为了改善数据库更新的管理,我一直在关注Flyway和Liquibase。两者似乎几乎都做我想要的,(除此之外:由于我们现有的所有SQL / DDL脚本,我现在更喜欢Flyway)。我能看到的问题是它们都直接更新了数据库。这适用于许多安装,但不是全部。

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

是否可以使用Flyway或Liquibase或其他任何工具进行此操作?

4 个答案:

答案 0 :(得分:6)

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

我们尝试将其纳入Flyway核心仓库并未成功。

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

答案 1 :(得分:5)

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

然而,您需要的是...... 不要这样做,而是使用Flyway来进行所有数据库更改。那就是你应该转向Hibernates自动架构更新并自己编写架构更新。每次要对数据库进行更改时,都必须编写架构更新。

有些人捕获了hibernates架构更新的SQL输出,以此作为获取自动架构演变更新的一种方式。问题是hibernate通常是错误的,特别是如果添加@NotNull列。

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

答案 2 :(得分:2)

是的,生成SQL脚本是Liquibase的内置功能。 Liquibase比flyway更具优势的另一个领域是它能够迁移数据库代码更改(包,程序和函数)。我使用飞路但我喜欢在飞路上有这些Liquibase功能。

答案 3 :(得分:2)

Flyway command line tool的文档说dryRunOutput是一个将SQL语句输出到指定文件的Flyway Pro功能。