2017-05-08 62 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兩者)。