是否可以将 Flyway、Liquibase 等数据库迁移工具与应用程序代码库集成?

Posted

技术标签:

【中文标题】是否可以将 Flyway、Liquibase 等数据库迁移工具与应用程序代码库集成?【英文标题】:Is it okay to integrate database migration tools like Flyway, Liquibase with the application code base? 【发布时间】:2016-04-26 01:01:48 【问题描述】:

我的意思是允许应用程序修改数据库是一种好习惯吗?还是应该在应用程序代码库外部完成数据库迁移?

对此很陌生,因此我们将不胜感激。

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

【问题讨论】:

你到底是什么意思?跟踪迁移脚本?还是执行迁移? 实际上都是。在此之前,我们曾经在 CVS 中保留单独的文件夹,尤其是用于 db 脚本。与代码库分开。 'Both,实际上'.. 迁移不是您的应用程序的一部分,我看不出您的应用程序如何执行它。但是将迁移脚本保留在项目中是合乎逻辑的:如果您不知道如何构建数据库,以后将如何在某个地方安装您的应用程序? 我认为很少有 gradle flyway 插件可以为您提供迁移任务。不过不确定 liquibase 或其他。 那么,您希望您的数据库迁移由可能无法正确启动的应用程序完成,除非迁移完成? 【参考方案1】:

没有,除非你不知道:

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

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

您的 DBA 向您的应用程序提供执行架构更改的能力,即在未经他们批准的情况下更改架构。

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

【讨论】:

【参考方案2】:

我完全同意 Axel 的观点。

但是,当您的数据库用户无权更改数据库结构或您根本不应该更改结构时,不让工具直接运行结构更改而是生成 SQL 脚本会派上用场。

然后可以将这些信息交给数据库管理员,由他先检查和批准 SQL,然后自己运行这些 SQL。

这就是我们(必须)这样做的方式。

不要误会。这只是多了一层间接性。不是让工具直接执行 SQL,而是让工具将 SQL 写入文件。然后 DBA 将从文件中执行 SQL。

【讨论】:

我会支持这个答案。我参与过许多项目,出于安全原因,应用程序的数据库用户没有 DDL 权限。我认为这很常见。您的解决方案绝对有效,我只是想展示我们如何在公司中做到这一点。在这里,这些步骤是完全自动化的。我们在构建中提取 Flyway/Liquibase 脚本(项目的一部分)作为应用程序本身之外的附加工件 (project-migrations.zip)。在部署期间,我们的编排工具只需使用 DBA 权限执行这些脚本,然后部署应用程序。【参考方案3】:

Flyway作者在这里。

是的!归根结底,有两个重要的力量在起作用:

    您的架构确实与您的应用程序代码紧密耦合:您的应用程序需要存在某些表和列,以便它可以读取和写入它们。哪些是完全不同的,从您的应用程序的一个版本到下一个版本。 您不想在应用程序/服务之间进行基于数据库的集成,因为这会破坏所有封装。数据库是服务的私有实现细节。应通过具有适当验证和业务规则执行的 API 层与其他服务集成。

因此,鉴于这一切,只需将属于一起的东西放在一起

通过让应用程序migrate the database on startup,您可以确保数据库架构始终与应用程序对其应该在那里找到的内容的期望保持同步。

【讨论】:

flyway 可以生成更新模式,而不是直接针对数据库运行。在某些情况下,DBA 可能希望先查看脚本,然后再在生产数据库上执行它们。 生产太晚了。让您的 DBA 与开发人员协作,以便您将正确的更改应用于所有数据库(开发、测试、登台和生产!)。 理想情况下,DBA 将与开发人员协作,以便预先批准更改,但现实情况是,某些组织具有难以更改的既定流程,需要审查脚本。 Axel - 也许这是我们可以添加到 FlySQL 的增值? ;) @anything - 请通过 Red-gate dot com 的 David dot Atkinson 联系我,因为我想更详细地了解您的要求!

以上是关于是否可以将 Flyway、Liquibase 等数据库迁移工具与应用程序代码库集成?的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 的 Liquibase 或 Flyway 数据库迁移替代方案

Flyway和liquibase在一起? [关闭]

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

Flyway 或 LiquiBase 可以在当前数据库和最新迁移之间进行区分吗?

使用 liquibase/flyway 类似 Terraform 的自动更新数据库,可能吗?

Flyway对比Liquibase(转)