目錄
- Spring Boot 3.0 : 集成flyway數據庫版本控制工具
- flyway是什么
- 為什么使用flyway
- 主要特性
- 支持的數據庫:
- flyway如何使用
- spring boot 集成實現
- 引入依賴
- 配置
- sql版本控制約定
- 3種版本類型
- 運行Spring
- Flyway 8.2.1及以后版本不再支持MySQL?
個人主頁: 【??個人主頁】
需要您的【💖 點贊+關注】支持 💯
Spring Boot 3.0 : 集成flyway數據庫版本控制工具
📖 本文核心知識點:
- flyway是什么
- 為什么使用flyway
- flyway如何使用
- spring boot 集成實現
flyway是什么
https://flywaydb.org/
我們都知道,Git/ SVN 是代碼界的版本控制工具,那么,Flyway 就是一款數據庫界的版本控制工具,它可以記錄數據庫的變化記錄。
Flyway是一個簡單開源數據庫版本控制器(約定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客戶端等,還提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。
為什么使用flyway
主要特性
- 普通 SQL:純 SQL 腳本(包括占位符替換)沒有專有的XML格式,沒有鎖定
- 無限制:使用 Java 代碼來進行一些高級數據操作
- 零依賴:只需運行在 Java6(及以上)和數據庫所需的 JDBC 驅動
- 約定優于配置:遷移時,自動查找系統文件和類路徑中的 SQL 文件或 Java 類
- 高可靠性:在集群環境下進行數據庫升級是安全可靠的
- 云支持:完全支持 Microsoft SQL Azure, Google Cloud SQL & App Engine、Heroku Postgres 和 Amazon RDS
- 自動遷移:使用 Flyway 提供的 API,讓應用啟動和遷移同時工作
- 快速失敗:損壞的數據庫或失敗的遷移可以防止應用程序啟動
- 數據庫清理:在一個數據庫中刪除所有的表、視圖、觸發器,而不是刪除數據庫本身
可能很多公司都是通過人工去維護、同步數據庫腳本,但經常會遇到疏忽而遺漏的情況,舉個簡單的例子:
我們在開發環境對某個表新增了一個字段,而提交測試時卻忘了提交該 SQL 腳本,導致出現 bug 而測試中斷,從而影響開發、測試的工作效率。
有了 Flyway
,我們可以按版本約定
,統一管理所有的 SQL 腳本變更,在所有環境自動同步數據庫
,而無需人為手工控制,再也不用擔心因數據庫不同步而導致的各種環境問題
支持的數據庫:
flyway如何使用
支持的 7 個命令:
- Migrate(遷移)
- Clean(清理所有配置的對象)
- Info(顯示遷移狀態和細節)
- Validate(驗證遷移規則)
- Undo(撤消最近的遷移)
- Baseline(建立基線)
- Repair(修復遷移歷史表)
spring boot 集成實現
工具 | 版本 |
---|---|
spring boot | 3.1.5 |
flyway | 10.0.1 |
jdk | 17 |
mysql | 8 + |
Flyway 幾乎是零依賴
,最低的要求是:
JDK 1.7+
Jdbc Driver
引入依賴
implementation 'org.flywaydb:flyway-core:10.0.1'
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>10.0.1</version></dependency>
配置
Spring Boot 默認提供了對 Flyway 的自動配置:
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration
application.yaml
配置
spring:flyway:enabled: true# 禁止清理數據庫表clean-disabled: true# 如果數據庫不是空表,需要設置成 true,否則啟動報錯baseline-on-migrate: true# 與 baseline-on-migrate: true 搭配使用baseline-version: 0locations: - classpath:db/migration/mysql #(根據個人情況設置)
將需數據遷移的 sql 文件放置到 db/migration/mysql
目錄中,啟動 Spring Boot 項目即可運行 Flyway 進行數據遷移。
注意事項:
如果 flyway 不是項目初期引入,而是在數據庫已有表的情況下引入時必須設置
baseline-on-migrate: true
,設置該配置啟動項目后,flyway 就會在數據庫中創建flyway_schema_history
表,并且會往該表中插入一條 version = 1 的建表記錄,如果遷移數據有V1__
開頭的文件,掃描文件會忽略該文件不執行遷移,進而可能引發其他遷移數據出錯的問題。
sql版本控制約定
Flyway不限定腳本里面的內容,但是對腳本文件的名稱有一定的要求,基于約定由于配置的原則
,不同的類型通過文件命名方式進行區分
3種版本類型
- 版本遷移(Versioned Migrations)以
V
開頭,只會執行一次; - 回退遷移(Undo Migrations)以
U
開頭,執行一旦發生破壞性更改,就會很麻煩,項目中一般不用;可重復執行遷移(Repeatable Migrations)以R
開頭,每次修改后都會重新執行。 - 可重復運行的SQL,則以大寫的“R”開頭,后面再以兩個下劃線分割,其后跟文件名稱,最后以.sql結尾。比如,RaddTable.sql,Rupdate_user.sql。
版本號需要唯一,否則Flyway執行會報錯;如果
V__腳本.sql
,已經執行過了,不能修改里面的內容,再次執行Flyway就會報錯。R——腳本.sql,如有變化可以執行多次。
V開頭的SQL執行優先級要比R開頭的SQL優先級高。
運行Spring
Flyway 8.2.1及以后版本不再支持MySQL?
官方Flyway 8.2.1版本發布說明(https://flywaydb.org/documentation/learnmore/releaseNotes#8.2.1),如下圖所示
從說明上可知,MySQL代碼被提取出來作為插件,需要另外增加依賴,根據官方文檔(https://flywaydb.org/documentation/database/mysql)的說明,解決方案如下:
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-mysql</artifactId>
</dependency>