飞行路线和可重复迁移的初始化

Nic*_*asW 1 database-migration flyway

https://flywaydb.org/documentation/migration/repeatable引用 flyway 文档:

可重复迁移没有版本。相反,每次它们的校验和发生变化时都会(重新)应用它们。

这对于管理数据库对象非常有用,这些对象的定义可以简单地在版本控制中的单个文件中维护。

在单个迁移运行中,可重复的迁移总是最后应用,在所有挂起的版本化迁移都已执行之后。可重复迁移按其描述的顺序应用。

这听起来令人兴奋,但是我似乎无法找到有关这实际上是如何工作的以及如何初始化可重复迁移的任何说明。我知道对于版本化迁移,我可以创建一个基础迁移 ( https://flywaydb.org/documentation/existing ),然后运行基线命令为我的未来版本做好准备。但是对于可重复的迁移,我不明白 flyway 如何能够校验和更改。

相反,他们是

每次校验和更改时(重新)应用。

flyway 是否假设我正在从头开始重新创建我的数据库以使校验和比较正常工作?这将解释它如何能够比较校验和(因为它可以访问数据库中已有对象的文件定义)。

小智 5

让我们假设您的可重复迁移 SQL 脚本的校验和是例如 123。

  1. 第一次运行 Flyway 时,它会检查 schema_version 表,发现这个可重复的迁移还没有被应用,所以它会执行它。
  2. 第二次启动 Flyway 时,它会检查您的 SQL 脚本的校验和是否等于 123,这等于自上次以来记录在 schema_version 中的内容,因此不会执行您的可重复迁移脚本。
  3. 现在假设您修改了第三个版本的可重复迁移 SQL 脚本,校验和更改为例如 987。当您启动 Flyway 时,它会发现 987 不等于仍存储在 schema_version (123) 中的内容,因此这次它将执行新版本的可重复迁移 SQL,然后将 schema_version 中的 123 校验和值更新为 987。

这意味着您可以根据需要不断更改每个新版本的可重复迁移脚本。您不能以这种方式更新基线(不可重复)脚本,因为 Flyway 会抛出关于不匹配校验和的错误。