2017-05-08 102 views
0

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

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

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

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

非常感谢您的帮助!

回答

0

1)幂等迁移是一种可以运行多次的迁移,但仍然具有与仅运行一次相同的效果。为了达到这个目的,你不需要每次修改数据库表时都要写表创建代码。试图做到这一点也将变得不可能很快保持。

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

例如:如果你的数据库是状态A,并且在运行迁移x到它到达B:

M(A, x) -> B 

然后,你需要写X,使数据库状态还是B还送如果x然再次:

M(B, x) -> B 

这将允许您运行相同的迁移脚本不止一次(得心应手例如,如果在脚本中的语句中的一个失败,但以前的成功)。

2)接下来,设置outOfder = true将允许flyway运行尚未运行的任何迁移,即使迁移比最新运行的迁移早。因此,如果您有三次迁移,x,y和z(按此顺序),并且x和z针对数据库运行,然后未设置outOfOrder,则一旦可用,flyway就不会运行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为RAN中,状态可以是B或C.由此,需要被写入所以迁移脚本ÿ除了是幂等的,它还可以用于它的起始状态,并允许z在它跑完之后仍然起作用(z必须正确运行f或状态B和C两者)。