天天看點

在SpringBoot中使用flyway管理資料庫版本狀态

本文大綱

flyway是什麼

能幫助我們解決什麼問題

springboot環境下使用flyway

flyway的工作原理

一、flyway是什麼

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

在SpringBoot中使用flyway管理資料庫版本狀态

二、能幫助我們解決什麼問題

那麼,我們首先解釋一下什麼是資料庫版本管理?

大家都知道git是幫助軟體項目進行代碼版本的管理,友善程式員協同開發

那麼FlyWay就是資料庫版本管理的工具,目标是保證多環境下資料庫的狀态一緻性,友善程式員協同開發

舉個簡單的例子:

開發人員通常使用同一個資料庫或者自建庫進行開發工作,這個資料庫通常叫做開發庫。

測試人員為了保障測試資料的有效性,通常自建一個庫進行測試,這個資料庫叫做測試庫。

銷售人員為了保證示範資料的效果,通常也需要一個單獨的資料庫,這個資料庫叫做示範庫。

正式生産上線的庫,供給最終使用者使用,這個資料庫叫做生産庫。

那麼問題就來了:我們如何保證資料庫schema的狀态一緻?某一個開發人員修改了開發庫,新增了一個字段,如何能夠有效的同步到測試庫,測試通過之後如何有效的同步到示範庫和生産庫?在沒有Flyway之前,這個動作通常是由上線程式員自己去執行SQL來完成的,或者比較正規的公司專門有版本管理人員去操作。這種方式通常存在幾個問題:

開發團隊内部的溝通成本增加,比如某一個成員修改了一個資料庫字段,其他人可能都不知道。

開發團隊和測試團隊和其他團隊之間的溝通成本增加

無法完成自動化的持續內建,持續內建的過程代碼可以通過git、maven、docker、k8s等工具來實作自動化的代碼打包、部署。但是資料庫的狀态變化沒有得到有效的自動變更,持續內建的過程的自動化就無法實作。

這也就是我們學習Flyway的目的:Flyway能夠自動的幫助我們有效的同步各個釋出資料庫之間的狀态,不管你是加了或者删了一個字段,還是新加了一張表,他都能自動化的跟随項目的釋出同時釋出。

三、 springboot環境下使用flyway

首先,我們為SpringBoot項目添加Flyway依賴

在SpringBoot中使用flyway管理資料庫版本狀态

然後我們要保證資料庫裡面有spring.datasource的資料源配置。并且在application.yml中添加如下的配置

在SpringBoot中使用flyway管理資料庫版本狀态

然後在resources/db/migration目錄下面,加入如下格式的腳本:

在SpringBoot中使用flyway管理資料庫版本狀态

大寫V後面緊跟資料庫腳本的版本号(遞增形式、不能重複),然後兩個下劃線,之後是對腳本内容進行描述。如:V1.1__create_table.sql是用于建立表結構的資料庫腳本,内容是create table之類的DDL。 第二個腳本是對資料庫中person表進行了更新。總之腳本裡面的内容,就是你希望對spring.datasource代表的資料庫進行的操作,可以是表的建立、删除、修改,也可以是對資料的建立删除修改。

當然,我個人不建議将DML-SQL寫入腳本,也就是不要在這個腳本裡面寫insert、update、delete。以免不注意的情況下,造成生産資料的誤操作。如果你們公司在生産上線管理方面沒有嚴格的稽核程式,在生産環境下,就幹脆不要使用flyway,友善開發是一方面,生産安全更為重要!

最後,啟動SpringBoot項目,在該目标庫範圍内沒有執行過的SQL腳本被執行。并将腳本執行資訊儲存在資料庫的schema_version_history資料表裡面。

四、FlyWay的工作原理

在SpringBoot中使用flyway管理資料庫版本狀态

首先項目啟動flyway會去db/migration下面掃描檔案,擷取檔案名,并解析版本号

然後去schema_version_history表裡面找對應的版本執行資訊,如果你的檔案版本号大于資料庫記錄版本,就執行腳本。否則就忽略。

上一篇: NOIP模拟77