最近想給項目添加數據庫版本管理工具Flyway,花了幾天時間研究了一下,本文將從一個初學者的角度使用Flyway。
一、Flyway介紹
Flyway是一個開源的數據庫版本管理工具,它通過創建歷史記錄表來跟蹤數據庫狀態,實現自動化遷移。Flyway以其簡單、專注和強大的特點,幫助開發團隊輕松管理數據庫的變更和版本控制。
剛開始看到這些描述的時候總感覺懵懵的,理解不了Flyway的用處,其實通俗的說,Flyway就是為了保證開發環境和生產環境的表結構一致,防止因為開發環境中修改表結構而忘了在生產環境中修改表結構而造成的錯誤;同時Flyway也可以對數據庫版本進行管理,在需要時可以根據執行記錄回滾(不過親測社區版沒有這個功能,需要使用pro版)。
二、Flyway的工作流程
1.項目啟動時,程序會自動執行指定路徑(默認是 :db/ )下的sql文件。
2.第一次執行時,會創建一個名為 y 的表,用于記錄數據庫的版本信息,當數據庫非空時,會自動生成基線(需在配置文件中開啟)。
3. Flyway會根據文件名按版本號從小到大依次執行。
三、Flyway環境搭建
1.在pom文件中引入依賴(注意是當前模塊的pom文件)
<dependency>
<groupId>org.flywaydbgroupId>
<artifactId>flyway-coreartifactId>
<version>6.1.0version>
dependency>
2.yaml文件中添加相關配置
flyway:
# 是否啟用flyway
enabled: true
# 編碼格式,默認UTF-8
encoding: UTF-8
# 遷移sql腳本文件存放路徑,默認db/migration

locations: classpath:db/migration
# 遷移sql腳本文件名稱的前綴,默認V
sql-migration-prefix: V
# 遷移sql腳本文件名稱的分隔符,默認2個下劃線__
sql-migration-separator: __
# 遷移sql腳本文件名稱的后綴
sql-migration-suffixes: .sql
# 遷移時是否進行校驗,默認true
validate-on-migrate: true
# 當遷移發現數據庫非空且存在沒有元數據的表時,自動執行基準遷移,新建schema_version表
baseline-on-migrate: true
3.若需要使用Flyway插件,還需加入插件的依賴,非必須。
<build>
<plugins>
<plugin>
<groupId>org.flywaydbgroupId>
<artifactId>flyway-maven-pluginartifactId>
<version>5.2.4version>
<configuration>
<url>jdbc:mysql://localhost:3306/flyway-demo?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiurl>
<user>rootuser>
<password>rootpassword>

<driver>com.mysql.cj.jdbc.Driverdriver>
configuration>
plugin>
plugins>
build>
四、Flyway使用方法
(1)新建sql文件
需要更改表結構或數據時,不要直接在數據庫管理工具(如Navicat)中更改,而是采用寫sql語句的方式。
在路徑/db/下新建sql文件(需嚴格按照文件命名規則),根據需求寫sql語句,然后啟動項目即可,flyway會自動執行sql文件并將該版本記錄在表y中。
(2)sql文件命名規則
sql文件命名需要嚴格按照命名規則,且版本號遞增的方式命名。
1.僅需要被執行一次的sql命名以大寫的"V"開頭,V+版本號(版本號的數字間以"."分隔開)+雙下劃線(用來分隔版本號和描述)+文件描述+后綴名。為避免命名沖突且保證版本號遞增,版本號盡量采用 年月日時分秒 進行命名。例:假如當前時間是2024年8月27日15時59分18秒,需求是新建表,則文件命名為:
V2024.8.27.15.59..sql。
若執行失敗,可嘗試修改文件名中的版本號,修改為執行時時間。
文件一旦被執行不允許再次修改,若有新需求需重新創建sql文件。
2.可重復運行的SQL,則以大寫的“R”開頭,后面再以兩個下劃線分割,其后跟文件名稱,最后以.sql結尾。比如: .sql 。文件每次被修改都會重新執行。
五、可能遇到的問題
1.如果報錯,可以檢查數據庫名稱、用戶名、密碼等是否正確;
2.報錯還可能的原因是依賴沖突問題,我報的錯是不支持MySQL5.7版本,實際上是不知道在哪里已經有了一個Flyway8.x的依賴,跟我引入的6.1.0版本產生了沖突,只需在父pom文件中加入依賴強制使用6.1.0版本即可解決。
3.有可能執行沒有報錯,但是就是執行沒有效果,我也不知道是什么原因,試了幾個只有6.1.0可以生效,所以可以嘗試切換Flyway的版本解決。
4.還有一種情形:多人協作時,假設A和B都新建了sql文件,A的版本低于B,A執行項目后,數據庫記錄了該版本,但是A還沒來得及提交代碼到git上,B執行項目時會因為缺少A的sql文件而報錯,若想要避免報錯,可以在配置文件中將
flyway.ignore-missing-設置為true。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。