Java 将数据库迁移工具(如Flyway、Liquibase)与应用程序代码库集成可以吗?

Java 将数据库迁移工具(如Flyway、Liquibase)与应用程序代码库集成可以吗?,java,gradle,database-migration,liquibase,flyway,Java,Gradle,Database Migration,Liquibase,Flyway,我的意思是允许应用程序修改数据库是一种好的做法吗?或者数据库迁移应该在应用程序代码库的外部进行 新的,所以任何输入将被赞赏 我们正在使用java和gradle构建应用程序。作者在这里 对!!归根结底,有两种重要力量在起作用: 您的模式与您的应用程序代码紧密耦合:您的应用程序希望存在某些表和列,以便能够读写它们。在不同版本的应用程序中,哪些版本完全不同 您不希望在应用程序/服务之间进行基于数据库的集成,因为这会破坏所有封装。数据库是服务的私有实现细节。与其他服务的集成应该通过具有适当验证和业务规则

我的意思是允许应用程序修改数据库是一种好的做法吗?或者数据库迁移应该在应用程序代码库的外部进行

新的,所以任何输入将被赞赏

我们正在使用java和gradle构建应用程序。

作者在这里

对!!归根结底,有两种重要力量在起作用:

  • 您的模式与您的应用程序代码紧密耦合:您的应用程序希望存在某些表和列,以便能够读写它们。在不同版本的应用程序中,哪些版本完全不同
  • 您不希望在应用程序/服务之间进行基于数据库的集成,因为这会破坏所有封装。数据库是服务的私有实现细节。与其他服务的集成应该通过具有适当验证和业务规则实施的API层实现
  • 因此,考虑到这一切,只要把属于我们的东西放在一起就行了


    通过允许应用程序运行,您可以确保数据库模式始终与应用程序在那里应该找到的内容保持同步。

    我完全同意Axel的观点

    但是,如果您的DB用户没有更改DB结构的权限,或者您根本不应该更改结构,那么不让工具直接运行结构更改,而是生成SQL脚本就很方便了

    然后,可以将这些文件交给DB管理员,由其首先检查和批准SQL,然后自己运行这些文件

    我们必须这样做


    别弄错了。这只是间接的一个层次。不让工具直接执行SQL,而是让工具将SQL写入文件。然后DBA将从文件中执行SQL

    没有,除非您不知道:

    • 在同一数据库中运行多个应用程序。因此,您需要选择一个保存所有脚本的脚本

    • 您需要能够回滚部署,否则需要在每次启动时对数据库进行快照

    • 您的DBA向您的应用程序提供执行模式更改的能力,即在未经其批准的情况下进行模式更改


    通过将flyway目标版本与所有项目中的代码保持在一起,可以轻松实现代码和模式的耦合。

    您的确切意思是什么?跟踪迁移脚本?或者执行迁移?实际上都是。在此之前,我们通常在CVS中保留单独的文件夹,特别是对于db脚本。与代码库分开。“实际上,两者都是”。。迁移不是应用程序的一部分,我不知道应用程序如何执行迁移。但是在项目中保留迁移脚本是合乎逻辑的:如果您不知道如何构建数据库,那么以后如何在某处安装应用程序?我认为很少有gradle flyway插件为您提供迁移任务。但不确定liquibase或其他。因此,您希望数据库迁移由一个可能无法正确启动的应用程序完成,除非迁移已完成?flyway是否可以生成更新架构,而不是直接针对数据库运行。在某些情况下,DBA可能希望在生产dbs上执行脚本之前先查看一下脚本。生产已经太迟了。让您的DBA与开发人员协作,以便将正确的更改应用于所有数据库(开发人员、测试人员、临时人员和生产人员!)。理想情况下,DBA将与开发人员协作,以便预先批准更改,但现实情况是,一些组织很难更改需要审查脚本的既定流程。Axel-也许这是我们可以为FlySQL添加的附加值?;)@任何事情-请联系我在大卫点阿特金森在红门网站,因为我想了解您的要求更详细!我会支持这个答案。我参加过许多项目,出于安全原因,应用程序的数据库用户没有DDL权限。我认为这很常见。你的解决方案确实有效,我只是想展示一下我们公司是如何做到这一点的。在这里,这些步骤是完全自动化的。我们在构建中提取Flyway/Liquibase脚本(项目的一部分),作为应用程序本身之外的附加工件(projectmigrations.zip)。在部署过程中,我们的编排工具仅使用DBA权限执行这些脚本,然后部署应用程序。