在SpringBoot中使用flyway進行數據庫版本管理
- 2019 年 11 月 5 日
- 筆記
本文大綱
- 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依賴
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>6.0.7</version> </dependency>
然後我們要保證數據庫裏面有spring.datasource的數據源配置。並且在application.properties中添加如下的配置
spring: flyway: enabled: true #啟用flyway encoding: utf-8 #字符編碼 locations: ["classpath:db/migration"] #版本控制文件存放目錄
然後在resources/db/migration目錄下面,加入如下格式的腳本:
V1.1__create_table.sql V1.2__update_person_table.sql V1.3__create_new_table.sql V1.4__add_person_comment.sql V2.1__modify_person_data.sql
大寫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表裏面找對應的版本執行信息,如果你的文件版本號大於數據庫記錄版本,就執行腳本。否則就忽略。
期待您的關注
- 博主最近新寫了一本書:《手摸手教您學習SpringBoot系列-16章97節》
-
本文轉載註明出處(必須帶連接,不能只轉文字):字母哥博客。