将 Flyway 集成到现有数据库中

Integrating Flyway into an existing database

我们从项目开始就没有使用过Flyway。我们正处于先进的发展状态。一位专家评论建议在我们的项目中使用 Flyway。

问题是我们已经将部分服务(微服务)也移到了另一个测试环境中。

正确实施 Flyway 的最佳方法是什么?要求是:

  1. 在开发环境中,无需更改已经存在的架构。但所有新脚本都应该使用 Flyway 完成。

  2. 在测试环境中,无需更改已经存在的架构。但是当我们将项目从 Dev 迁移到测试时,应该使用 Flyway 自动创建测试环境中不可用的内容。

  3. 当我们迁移到一个全新的环境(UAT、生产等)时,整个模式应该使用 Flyway 自动创建。

根据文档,我的理解是:

  1. 将开发模式(DDL 和 DML)备份为 SQL 脚本文件,文件名如 V1_0_1__initial.sql.
  2. 使用“flyway clean”清理开发数据库。
  3. 开发数据库“flyway baseline -baselineversion=1.0.0”的基线
  4. 现在,执行“flyway migrate”,它将应用 SQL 脚本文件 V1_0_1__initial.sql。
  5. 任何新脚本都应该用更高的版本号编写(比如V2_0_1__account_table.sql)

这是正确的方法还是有更好的方法?

问题是我有一个测试数据库,其中我们有不同的数据集(开发和测试中的数据不同,我想在两个环境中保持数据不变)。如果是这样,我们从Dev环境中取出来,在每个环境中分别应用时,把DDL和DML分开放在不同的脚本文件中好不好? DML可以根据需要手动添加;但如果我做的是对的,我会有点困惑。

提前致谢。

那么,这里其实有两个问题。数据管理和飞行路线管理。

在数据管理方面,是的,那应该是一个单独的事情。数据不断增长。除了简单的查找表之外,尝试从源代码管理管理数据很快就会变得很成问题。更不用说您想要在不同环境中使用不同的数据。这也使得自动化部署变得更加困难(如果你坚持走这条路,分支将是你的朋友,每个数据集一个分支,然后适当地部署)。

您可以在现有项目上实施 Flyway,是的。关键是建立基线。您不必执行上面概述的所有步骤。假设您有一个现有数据库。您必须获得定义该数据库的脚本。该单个脚本应包括所有适当的 DDL(如果需要,还包括 DML)。按照 Flyway 标准命名。像 V1.0__Baseline.sql.

有了这些,您所要做的就是运行:

flyway baseline

这将建立您现有的代码库作为起点。从那里,您只需按照命名标准创建脚本:V1.1xxx V2.0xxx V53000.1xxx。并且 运行

flyway migrate

部署适当的更改。

对此唯一的警告是,如文档所述,您必须确保所有数据库都与您正在创建并标记为基线的 V1.0 相匹配。当您引入新的更改并将它们迁移到位时,任何偏差都会导致错误。只要你有匹配的基线点,你就应该能够在不同的环境中继续处理不同的数据而不会出现问题。

这是我的 how-to 关于与产品数据库集成 flyway 的说明:https://delicious-snipe-938.notion.site/How-to-integrate-Flyway-with-existing-MySQL-DB-in-Prod-PostgreSQL-is-similar-1eabafa8a0e844e88205c2f32513bbbe