本文大綱
flyway是什麼
能幫助我們解決什麼問題
springboot環境下使用flyway
flyway的工作原理
一、flyway是什麼
Flyway是一個開源的資料庫版本管理工具,并且極力主張“約定大于配置”,簡單、專注、強大。可以使用SQL完成資料同步,或者基于特定資料庫的文法(例如PL / SQL,T-SQL等)或Java代碼(适用于進階資料轉換或處理LOB)的方式編寫。并且資料庫支援非常廣泛:

二、能幫助我們解決什麼問題
那麼,我們首先解釋一下什麼是資料庫版本管理?
大家都知道git是幫助軟體項目進行代碼版本的管理,友善程式員協同開發
那麼FlyWay就是資料庫版本管理的工具,目标是保證多環境下資料庫的狀态一緻性,友善程式員協同開發
舉個簡單的例子:
開發人員通常使用同一個資料庫或者自建庫進行開發工作,這個資料庫通常叫做開發庫。
測試人員為了保障測試資料的有效性,通常自建一個庫進行測試,這個資料庫叫做測試庫。
銷售人員為了保證示範資料的效果,通常也需要一個單獨的資料庫,這個資料庫叫做示範庫。
正式生産上線的庫,供給最終使用者使用,這個資料庫叫做生産庫。
那麼問題就來了:我們如何保證資料庫schema的狀态一緻?某一個開發人員修改了開發庫,新增了一個字段,如何能夠有效的同步到測試庫,測試通過之後如何有效的同步到示範庫和生産庫?在沒有Flyway之前,這個動作通常是由上線程式員自己去執行SQL來完成的,或者比較正規的公司專門有版本管理人員去操作。這種方式通常存在幾個問題:
開發團隊内部的溝通成本增加,比如某一個成員修改了一個資料庫字段,其他人可能都不知道。
開發團隊和測試團隊和其他團隊之間的溝通成本增加
無法完成自動化的持續內建,持續內建的過程代碼可以通過git、maven、docker、k8s等工具來實作自動化的代碼打包、部署。但是資料庫的狀态變化沒有得到有效的自動變更,持續內建的過程的自動化就無法實作。
這也就是我們學習Flyway的目的:Flyway能夠自動的幫助我們有效的同步各個釋出資料庫之間的狀态,不管你是加了或者删了一個字段,還是新加了一張表,他都能自動化的跟随項目的釋出同時釋出。
三、 springboot環境下使用flyway
首先,我們為SpringBoot項目添加Flyway依賴
然後我們要保證資料庫裡面有spring.datasource的資料源配置。并且在application.yml中添加如下的配置
然後在resources/db/migration目錄下面,加入如下格式的腳本:
大寫V後面緊跟資料庫腳本的版本号(遞增形式、不能重複),然後兩個下劃線,之後是對腳本内容進行描述。如:V1.1__create_table.sql是用于建立表結構的資料庫腳本,内容是create table之類的DDL。 第二個腳本是對資料庫中person表進行了更新。總之腳本裡面的内容,就是你希望對spring.datasource代表的資料庫進行的操作,可以是表的建立、删除、修改,也可以是對資料的建立删除修改。
當然,我個人不建議将DML-SQL寫入腳本,也就是不要在這個腳本裡面寫insert、update、delete。以免不注意的情況下,造成生産資料的誤操作。如果你們公司在生産上線管理方面沒有嚴格的稽核程式,在生産環境下,就幹脆不要使用flyway,友善開發是一方面,生産安全更為重要!
最後,啟動SpringBoot項目,在該目标庫範圍内沒有執行過的SQL腳本被執行。并将腳本執行資訊儲存在資料庫的schema_version_history資料表裡面。
四、FlyWay的工作原理
首先項目啟動flyway會去db/migration下面掃描檔案,擷取檔案名,并解析版本号
然後去schema_version_history表裡面找對應的版本執行資訊,如果你的檔案版本号大于資料庫記錄版本,就執行腳本。否則就忽略。