flyway和可重复迁移的初始化

Posted

技术标签:

【中文标题】flyway和可重复迁移的初始化【英文标题】:flyway and initialization of Repeatable migrations 【发布时间】:2017-08-13 07:59:32 【问题描述】:

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

可重复迁移没有版本。相反,他们是 (重新)每次校验和更改时应用。

这对于管理定义可以 然后在版本控制中简单地维护在一个文件中。

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

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

他们是

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

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

【问题讨论】:

【参考方案1】:

假设您的可重复迁移 SQL 脚本的校验和是例如123.

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

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

【讨论】:

谢谢,我了解 flyway 如何能够在初始化后检测到更改 - 一旦它具有 sql 代码的哈希值。在测试时,我发现这里没有魔法,第一次检测到可重复的迁移时,flyway 将运行它。这使得在处理非空项目时事情变得不太容易。 好的,那么可重复的脚本只有在您更改脚本时才会运行?我正在使用 R 脚本为另一个用户创建同义词,我添加了一个新表并注意到新表没有同义词。现在我知道为什么了,但是我可以让 R 脚本每次都运行吗?【参考方案2】:

更新:我知道已经有一段时间了,我正在寻找的解决方案是飞路维修。它会将预先存在的模式与 flyway 内部校验和表同步。 https://flywaydb.org/documentation/commandline/repair

我已经测试过flyway,现在了解初始化:flyway 将忽略现有的脚本/迁移,只要文件名没有特定的前缀(我认为'REPEATABLE'是默认值) - 只要迁移不是重命名为执行 flyway 将忽略它们。

【讨论】:

是的,正确,Flyway 不会调查您的数据库中存在哪些表或类似的东西,它只依赖于它自己之前存储在 schema_version 中的内容。前缀只是“R”,可以是configured

以上是关于flyway和可重复迁移的初始化的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Spring 应用程序中使用 Flyway 1.6 进行迁移

Kubernetes - 使用 flyway 作业在 postgres 数据库上执行迁移 - 连接问题

Flyway 可重复迁移 - 在版本化迁移之前执行?

Flyway 可重复迁移随机运行

Flyway 始终执行可重复的迁移

可以重命名 Flyway 可重复迁移吗?