簡介
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的歷史記錄表中也會增加本次執行的記錄。
