将 Flyway 集成到现有数据库中

SRa*_*Raj 7 flyway

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

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

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

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

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

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

从文档中,我的理解是:

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

这是正确的方法还是有更好的方法来做到这一点?

问题是我有一个测试数据库,其中有不同的数据集(开发和测试中的数据不同,我想保留两个环境中的数据)。如果是这样,当我们从Dev环境中取出并在每个环境中单独应用它们时,是否可以将DDL和DML分离在不同的脚本文件中?可以根据需要手动添加DML;但有点困惑我是否在做正确的事情。

提前致谢。

Gra*_*hey 7

所以,这里实际上有两个问题。数据管理和飞行路线管理。

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

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

完成后,您所要做的就是运行:

flyway baseline
Run Code Online (Sandbox Code Playgroud)

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

flyway migrate
Run Code Online (Sandbox Code Playgroud)

部署适当的更改。

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

  • 如果您要使用全新的数据库,则不需要基线。“迁移”命令将部署您拥有的数据库。您的基线,在空白数据库中,就是数据库。哎呀,我使用了 Flyway 部署,其中第一个脚本 V1 是脚本中的 CREATE DATABASE 命令。因此,您确实不需要在空白数据库中建立基线。 (3认同)
  • 创建基线涉及两件事。首先,您要在现有数据库中开始工作,因此您需要建立该起点。其次,您必须进行带外调整、手动脚本或其他调整,并且作为重置的一种方式,以便您可以再次继续使用 Flyway,您需要建立一个新的基线。希望有帮助。 (2认同)