簡介
Flyway 是一款開源的資料庫版本管理工具。它可以很友善的在指令行中使用,或者在Java應用程式中引入,用于管理我們的資料庫版本。
在項目或産品中,很難一開始就把業務理清楚,把資料庫表設計好,是以資料表也會在疊代周期不斷疊代。在Java應用程式中使用Flyway,能快速有效地用于疊代資料庫表結構,并保證部署到測試環境或生産環境時,資料表都是保持一緻的。
Flyway是如何工作的
Flyway工作流程如下:
- 項目啟動,應用程式完成資料庫連接配接池的建立後,Flyway自動運作。
- 初次使用時,Flyway會建立一個 flyway_schema_history 表,用于記錄sql執行記錄。
- Flyway會掃描項目指定路徑下(預設是 classpath:db/migration )的所有sql腳本,與 flyway_schema_history 表腳本記錄進行比對。如果資料庫記錄執行過的腳本記錄,與項目中的sql腳本不一緻,Flyway會報錯并停止項目執行。
- 如果校驗通過,則根據表中的sql記錄最大版本号,忽略所有版本号不大于該版本的腳本。再按照版本号從小到大,逐個執行其餘腳本。
在SpringBoot項目使用Flyway
以下示範如何在SpringBoot項目中使用Flyway,代碼儲存我的Github倉庫。
1、初始化一個SpringBoot項目,引入MySQL資料庫驅動依賴等,并且需要引入Flyway依賴:
<!--引入flyway-->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>6.1.0</version>
</dependency>
2、添加Flyway配置:
spring:
# 資料庫連接配接配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm-demo?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: xxx
password: xxx
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、根據在配置檔案的腳本存放路徑的配置,在resource目錄下建立檔案夾 db/migration 。
4、添加需要運作的sql腳本。sql腳本的命名一定要規範,否則運作flyway會報錯。命名規則主要有兩種:
- 僅需要被執行一次的SQL命名以大寫的"V"開頭,V+版本号(版本号的數字間以”.“或”_“分隔開)+雙下劃線(用來分隔版本号和描述)+檔案描述+字尾名。例如: V20201100__create_user.sql、V2.1.5__create_user_ddl.sql、V4.1_2__add_user_dml.sql 。
- 可重複運作的SQL,則以大寫的“R”開頭,後面再以兩個下劃線分割,其後跟檔案名稱,最後以.sql結尾。(不推薦使用)比如: R__truncate_user_dml.sql 。
其中,V開頭的SQL執行優先級要比R開頭的SQL優先級高。

其中2.1.6、2.1.7和every的檔案夾不會影響flyway對SQL的識别和運作,可以自行取名和分類。
5、啟動項目。啟動成功後,在資料庫中可以看到已按照定義好的腳本,完成資料庫變更,并在 flyway_schema_history 表插入了sql執行記錄:
如果我們修改
V2__add_user.sql
中的内容,再次執行的話,就會報錯,提示資訊如下:
[ERROR] Migration checksum mismatch for migration version 2
如果我們修改了
R__add_unknown_user.sql
,再次執行的話,該腳本就會再次得到執行,并且flyway的曆史記錄表中也會增加本次執行的記錄。