当前位置: 首页 > 知识库问答 >
问题:

flyway和可重复迁移的初始化

唐裕
2023-03-14

报价飞行路线文件https://flywaydb.org/documentation/migration/repeatable :

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

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

在一次迁移运行中,可重复迁移始终在所有挂起的版本化迁移执行完毕后最后应用。可重复迁移按其描述的顺序应用。

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

相反,他们是

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

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

共有2个答案

萧星火
2023-03-14

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

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

祁鸿晖
2023-03-14

假设可重复迁移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将抛出关于不匹配校验和的错误。

 类似资料:
  • Flyway 4.2.0中的可重复Java迁移存在问题。 例如,我编写了一个可重复的Java迁移,它为每个具有特定列的表创建一个触发器。此迁移的ChecksumProvider计算缺少触发器的表的连接名称的哈希代码。 > 当表列表不为空时,hashcode不同于零(将其命名为xxx),并且对于每个表,都会向数据库添加一个合适的触发器。在这种情况下,hascode xxx被写入“schema_ver

  • 在使用可重复迁移时,我观察到一些奇怪的飞行路线行为。文件指出: 在一次迁移运行中,可重复迁移始终在所有挂起的版本化迁移执行完毕后最后应用。 但在我的例子中,可重复迁移(正在重新创建一个DB视图)似乎失败了,因为它是在版本化迁移之前执行的。 迁移前的Flyway信息数据:

  • 在Spring启动应用程序中,我们在db.migrations资源文件夹中设置了版本化迁移 V1_0__create_table.sql V1_1__apply_roles.sql R__create_stored_proc.sql 版本化迁移(V1\u 0和V1\u 1)在应用程序启动时运行/验证,但似乎根本不会触发可重复迁移(R\u)。 我们有一个后迁移。sql,这似乎是触发的。 有人能帮我理

  • Flyway在其留档中说明了可重复迁移的一些用法: 用法:(重新)创建视图/过程/函数/包/... 我想在可重复迁移中创建一些触发器/函数,这些稍后会在版本迁移中引用,并应用到表中。 Flyway最后运行可重复的迁移,这意味着触发器在被引用时不存在。 是否可以在版本化迁移之前运行某些可重复的迁移? 是否不支持此用例,因为自动更新应用于表的触发器是不好的做法?

  • 我刚刚在配置和充分理解flyway的过程中遇到了这样的情况: 我已成功配置新项目以使用Flyway。 我已成功将测试数据库从版本0迁移到1.0.3。 无法执行到版本1.0.4的迁移。(我试图添加已经存在的列,到目前为止没有问题,是我的错。) 但是,一旦我对相应的脚本进行了必要的更改以使其工作,flyway就会不断显示这样的消息: 由于我不想恢复一个完整的转储并再次应用每一次迁移,只是为了使alte

  • 所以我有几个可重复的迁移。 创建一个视图(删除它 现在假设我修改了第一次迁移,结果视图不再包含第二次迁移使用的列。Flyway将愉快地重新运行第一次迁移,第一个视图将被重新创建,第二个视图将由于级联选项而被删除。 在此之后,我希望第二次(依赖的)迁移也会运行,并且会抛出一个错误(因为它使用了一个不再存在的列)。 这样可能吗? 以某种方式强制flyway检查现有迁移的结果是否不再存在?或者可能存在类