gpt4 book ai didi

mysql - 使用 Flyway 时的幂等迁移

转载 作者:行者123 更新时间:2023-11-29 19:01:25 24 4
gpt4 key购买 nike

我最近开始使用Flyway来控制SQL数据库。我一直在读到,在持续集成环境中工作时,在 Flyway 中编写幂等迁移并将 OutOfOrder 设置为 true 通常是一个很好的做法,其中分支可能会独立合并和部署。

我的理解是,幂等迁移,例如在表上创建索引,需要按如下操作:1)检查表是否存在,如果不存在则创建表。3)检查该列是否存在,如果不存在,则创建列。2)检查索引是否存在,如果不存在,则创建索引。

这会导致过程很大,并导致每次更改表时都需要一遍又一遍地复制此过程。

所以现在我有点困惑。这真的是在持续集成环境中实现Flyway的最佳方式吗?大家有更好的建议吗?

非常感谢您的帮助!

最佳答案

1) 幂等迁移是可以运行多次的迁移,但仍具有与仅运行一次相同的效果。为了实现这一点,您不需要每次想要修改数据库表时都编写表创建代码。尝试这样做也将变得不可能很快维护。

基本上,在迁移脚本中编写语句时,您需要知道在第一次运行该语句之前数据库的状态。现在,想想必须对该语句进行哪些修改才能确保它可以无错误地运行,即使它以前已经运行过。

例如:如果您的数据库处于状态 A 并且您运行迁移 x 将其转移到状态 B:

M(A, x) -> B 

那么你需要写x,这样即使再次运行x,数据库状态仍然是B:

M(B, x) -> B

这将允许您多次运行相同的迁移脚本(例如,如果脚本中的语句之一失败但之前的语句成功,这很方便)。

2) 接下来,设置 outOfOrder=true 将让 Flyway 运行任何尚未运行的迁移,即使迁移早于最新运行的迁移。因此,如果您有三个迁移,x、y 和 z(按此顺序),并且 x 和 z 是针对数据库运行的,则在没有设置 outOfOrder 的情况下,flyway 在 y 可用时将不会运行 y,因为 z 已经运行了。然而,当标志设置为 true 时,y 现在基本上会乱序运行 - 在 z 之后。

现在,如果您将 outOfOrder 设置为 true,您将需要意识到这种可能性,并且数据库中的起始状态现在可以有两个不同的值:

其中A是初始状态:

M(A, x) -> B
M(B, y) -> C
M(C, z) -> E
(Taking the state from A -> B -> C -> E)

M(A, x) -> B
M(B, z) -> D
M(D, y) -> E
(Taking the state from A -> B -> D -> E)

因此,在运行 y 之前,状态可以是 B 或 D,在运行 z 之前,状态可以是 B 或 C。因此,需要编写迁移脚本 y,以便除了幂等性,它也将在其两个起始状态下运行,并允许 z 在运行后仍然运行(z 必须在状态 B 和 C 下都正确运行)。

关于mysql - 使用 Flyway 时的幂等迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43850593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com