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

Is it okay to integrate database migration tools like Flyway, Liquibase with the application code base?

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

这是新手,所以任何意见都将不胜感激。

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

Flyway作者在这里

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

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

所以鉴于这一切,把属于一起的东西放在一起

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

我完全同意 Axel 将其保持在一起的观点。

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

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

我们(必须)这样做。

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

不会,除非您不知道:

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

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

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

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