轉自:https://www.huangyunkun.com/2017/03/16/database-tools-flywayt-vs-liquibase/
很多應用的運作是需要資料庫支援的,而随着快速疊代,産品更替的節奏加快,除了産品本身需要不斷更新以外,資料庫也需要做出合适的管理了。
為什麼需要資料庫遷移管理
比如第一個版本的産品隻包含了最基本的功能,而第二版本就需要增加評論功能,這就涉及到資料結構的修改(包括建立新表,修改舊表的列,增加已有表的列等等)。直接進入産品資料庫修改資料庫并不适合快速的開發節奏,不僅僅不安全,更多的情況下資料庫可能并不對外或者并不适合對外直接暴露連接配接,比如PAAS平台的資料庫以服務的形式直接提供。
對比代碼管理的一些實踐,很明顯在資料庫方面做的還欠缺很多。比如代碼管理中我們有
- 版本管理(svn,git等等)
- 持續內建技術
- 良好的釋出工具和流程
而在資料庫方面會遇到很多問題
- 某台資料庫現在是什麼狀态
- 修改變更的腳本是否已經應用
- 對于生産環境的緊急修複有沒有被應用在測試環境
- 如何建立一個新的資料庫執行個體
資料庫遷移工具可以很好的管理這些問題,并提供了以下特性
- 從遷移腳本中建立新的資料庫
- 檢查資料庫狀态
- 從一個版本快速到達另外一個版本
Flyway和Liquibase
資料庫遷移工具很多,這裡我們選擇Flyway和Liquibase來說主要是兩個原因,一是它們都是Java生态圈的,其次就是Spring Boot提供了這兩者的内建支援,可以很快應用到産品中。
Flyway相對簡單,直接将你需要執行的SQL語句儲存為檔案,放入應用中執行即可。比如
1 2 | V1__init - database . sql V2__add - comment . sql |
Flyway的好處在于簡單,而且直接書寫SQL并不需要額外的學習。
Liquibase相對就複雜了很多,它支援四種格式
- xml
- json
- yaml
- sql
如果使用過Flyway就會有一定的體會,Flyway的簡單是有代價的,舉個簡單的例子,如果我們開發環境是h2資料庫,而測試環境和産品環境是MySQL,這裡就有一個問題,SQL語句并不是一個廣泛相容的語言,有些關鍵字是獨有的,而我們并不希望放棄這部分功能。這種情況下你就需要書寫兩套SQL遷移檔案。Spring Boot是内建這種支援的,可以從目錄上做區分。
而Liquibase可以根據資料庫的情況為你生成最後的遷移語句,同時因為資料庫變動首先是被Liquibase解析,是以也可以簡單支援復原。
來看一個Liquibase的例子,以XML為例,我個人覺得yaml更簡潔,但是經常有對齊的問題。
XHTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <? xml version = "1.0" encoding = "UTF-8" ?> <databaseChangeLog xmlns = "http://www.liquibase.org/xml/ns/dbchangelog" xmlns : xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns : ext = "http://www.liquibase.org/xml/ns/dbchangelog-ext" xsi : schemaLocation = "http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd" > <changeSet id = "1" author = "nvoxland" > <createTable tableName = "person" > <column name = "id" type = "int" autoIncrement = "true" > <constraints primaryKey = "true" nullable = "false" /> </column> <column name = "firstname" type = "varchar(50)" /> <column name = "lastname" type = "varchar(50)" > <constraints nullable = "false" /> </column> <column name = "state" type = "char(2)" /> </createTable> </changeSet> <changeSet id = "2" author = "nvoxland" > <addColumn tableName = "person" > <column name = "username" type = "varchar(8)" /> </addColumn> <addLookupTable existingTableName = "person" existingColumnName = "state" newTableName = "state" newColumnName = "id" newColumnDataType = "char(2)" /> </changeSet> </databaseChangeLog> |
Liquibase支援大部分常見的資料庫變動操作,比如建表,删表,變動字段等等。
Liquibase可以在不使用SQL的情況下造成資料庫變動,其可讀性更高一些,特别是團隊并不直接使用SQL而整體相關知識儲備不完善的情況下優勢更明顯。
結論
兩款資料庫遷移工具其實定位上是差别的,一般我的傾向是小項目,整體變動不大的用Flyway,而大應用和企業應用用Liquibase更合适。