当前位置: 首页 > 知识库问答 >
问题:

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

颜志学
2023-03-14

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

为了改进数据库更新的管理,我一直在研究Flyway和Liquibase。这两个脚本似乎几乎都能满足我的需要(旁白:我现在更喜欢Flyway,因为我们有所有预先存在的SQL/DDL脚本)。我看到的问题是,它们都直接更新了数据库。这对于很多安装来说都是好的,但不是所有的。

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

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

共有3个答案

杨豪
2023-03-14

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

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

一些人捕获了Hibernate模式更新的SQL输出,作为获得自动模式进化更新的一种方式。问题是hibernate通常是错误的,尤其是当添加一个NotNull列时。

此外,就您的管理员而言,我相信Flyway可以根据其schema\u版本表和SQL/Java迁移脚本输出它将运行的SQL输出,因此您的DBA可以在Flyway之外运行它(如果没有,这将是一个很容易添加的功能)。

王杰
2023-03-14

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

我们试图将其纳入Flyway核心回购协议,但没有成功。

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

周涵畅
2023-03-14

Liquibase处理得很好。它在当前状态下查看数据库,查找未应用的变更集,并在SQL输出模式下使用更新命令生成SQL脚本。

使用适当的数据库迁移工具而不是Hibernate生成器是一种可行的方法。无论如何,迟早会出现Hibernate不支持的情况。对我们来说,它删除了一个唯一的索引,并用另一个索引替换它。您还可以启用Hibernate。hbm2ddl。自动=验证,以确保数据库结构和实体bean之间的兼容性。

 类似资料:
  • 问题内容: 首先,有一点背景。我有一套Java应用程序,有些基于JPA,有些则没有。为了创建数据库,我目前正在使用Hibernates模式导出来为使用JPA的用户生成创建脚本。那些不使用JPA的人会手工生成脚本。然后使用ANT在应用程序安装过程中运行它们。对于更新,应用程序安装程序只需将更新脚本应用于数据库。 为了改善数据库更新的管理,我一直在研究Flyway和Liquibase。两者似乎几乎都可

  • 我们仍处于项目的早期阶段,我们正在构建一个包含多个表的数据库。列出的两个工具都允许我们创建一些DDL / DML文件并跟踪对数据库的更改。无论如何,当结构仍未合并时,这可能会很麻烦。 假设我想添加一个新列,甚至删除一个表:在这两个程序中,我都必须使用ALTER TABLE/etc.命令创建一个新脚本并记录更改。 在terraform中,您只需编写所需的基础设施,当您通过删除节点来更改文件时,该工具

  • 我有一个Gradle脚本,它使用flyway插件来创建一些数据库表,现在我需要更新该脚本,以便它可以与两组单独的flyway脚本一起工作,每个脚本更新一个单独的数据库。 在单数据库版本的脚本中,我只是这样做: 我一直在尝试声明一个新任务来运行第二个数据库的脚本: 我的Gradle技能很差,但我知道这不是正确的方法——我的理解是块会覆盖原始flyway配置,所以如果我想在之后运行,它会继续使用第二组

  • 在我目前的项目中,有一个数据库团队在将它们应用到生产环境之前检查所有脚本。 我们使用Liquibase将变更集应用到开发中,但是对于生产,我们需要能够生成一个*。包含所有语句的sql文件。 根据液基-专家-插件的文档,updateSQL应该是我想要的:http://www.liquibase.org/documentation/maven/maven_updatesql.html。 所以我创建了两

  • 我对Liquibase和Flyway都是新手。想做一些你好的世界。我成功地使用Liquibase和Flyway运行了基本的SQL(创建、插入等)。有兴趣从命令行运行它们。 飞道: 开头比较容易 我必须将正确命名格式为“v1_xxxx.sql”的sql文件放在正确的文件夹“flyway/sql”中,并运行“flyway migrate” 最棒的是,它自动获取任何给定正确文件名的新sql文件。 液体碱

  • 我想将comment的键值更新为新值,同时保持其他键值不变。我知道我可能需要扩频器。。。但我不确定确切的语法。要实现这一点,我需要在setResource()中放入什么?