優(yōu)雅!Spring Boot使用Flyway進行數(shù)據(jù)庫腳本遷移管理
環(huán)境:SpringBoot2.7.18 + Flyway8.5.13
1. 簡介
Flyway是一個開源的數(shù)據(jù)庫遷移工具,它通過定義一系列有序的SQL腳本(稱為遷移),幫助你管理數(shù)據(jù)庫的結構變更。這些遷移腳本可以用于創(chuàng)建表、修改列、添加索引等任何數(shù)據(jù)庫更改操作。Flyway的主要特性和優(yōu)勢包括:
- 版本控制:Flyway為數(shù)據(jù)庫的每個變更分配一個版本號,只有新的變更才會被應用,已經(jīng)應用過的變更不會重復執(zhí)行。這使得數(shù)據(jù)庫變更更加可控和可追蹤。
- 跨平臺:Flyway支持主流的關系型數(shù)據(jù)庫,包括MySQL、PostgreSQL、Oracle、SQL Server等。
- 易用性:Flyway提供了簡單的命令行界面和API,使得開發(fā)人員可以輕松地集成到他們的項目中。同時,它還支持與Spring Boot等主流開發(fā)框架進行集成。
- 自動化:Flyway可以自動化執(zhí)行數(shù)據(jù)庫遷移,這使得敏捷開發(fā)團隊可以更快地開發(fā)新功能,同時也可以更容易地進行測試和部署。
在實際項目開發(fā)中通過Flyway可以確保每個數(shù)據(jù)庫變更都有一個唯一的版本號,并按照版本號順序執(zhí)行,從而避免了重復或錯亂的變更。這使得開發(fā)人員能夠清晰地跟蹤和管理數(shù)據(jù)庫的歷史變更,并確保不同環(huán)境(如開發(fā)、測試和生產)之間的數(shù)據(jù)庫結構一致性。
2. 實戰(zhàn)案例
注意:我當前使用的版本Flyway對應的數(shù)據(jù)庫mysql版本必須是8。
2.1 引入依賴
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId>
</dependency>
2.2 配置數(shù)據(jù)庫
spring:
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/pack?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=UTF-8
username: root
password: xxxooo
type: com.zaxxer.hikari.HikariDataSource
2.3 Flyway配置
spring:
flyway:
enabled: true
# 用于存儲遷移歷史記錄的表名, 默認: flyway_schema_history
table: flyway_schema_history
# 遷移腳本編碼, 默認: UTF-8
encoding: UTF-8
# 當遷移數(shù)據(jù)庫存在但沒有元數(shù)據(jù)的表時,自動執(zhí)行基準遷移,新建flyway_schema_history表
baseline-on-migrate: true
# 數(shù)據(jù)庫遷移腳本的位置, 默認: classpath:db/migration
# 這里也支持文件系統(tǒng)路徑,前綴:filesystem:
locations:
- classpath:db/migration
上面的配置都使用的默認值,如果你沒有自定義需求,你完全可以不進行配置。
最終項目目錄結構如下:
圖片
初始數(shù)據(jù)庫中有如下表:
圖片
2.4 準備數(shù)據(jù)庫升級腳本
接下來在db/migration下新建一個遷移腳本(升級),文件名:V1.0_001__create_table.sql
create table t_person (
id int auto_increment primary key,
name varchar(32) not null,
sex varchar(2) not null,
age int default 0
);
創(chuàng)建表t_person。
特別說明:通常情況下,遷移腳本的格式為 V<VERSION>__<NAME>.sql(其中 <VERSION> 為下劃線分隔的版本,如 "1 "或 "2_1";<NAME>一般你可以寫上該腳本的描述信息)。還有一點要注意:<VERSION>與<NAME>中間是兩個下劃線:'__',最終目錄如下:
圖片
到此所有的配置都完成,接下來只需要啟動服務即可。
2.5 啟動應用服務
控制臺輸出
圖片
通過控制臺輸出,得到下面兩個重要信息:
- 創(chuàng)建表flyway_schema_history
- 成功升級一個腳本版本是v1.0.001
查看數(shù)據(jù)庫情況
執(zhí)行了升級腳本,創(chuàng)建了數(shù)據(jù)庫。查看flyway_schema_history表數(shù)據(jù):
記錄了升級腳本文件及版本信息。當多次啟動服務并不會重復的執(zhí)行。如果你將這里的記錄刪除再吧t_person表刪除,那么下次重啟服務還會執(zhí)行升級腳本。
經(jīng)過xxx時間后系統(tǒng)升級數(shù)據(jù)庫腳本也升級了,我們可以繼續(xù)添加升級腳本文件,如下:
圖片
新增了一個腳本文件V1.1_001__update-t_person.sql,文件內容:
alter table t_person add column email varchar(32) default '';
啟動服務,控制臺輸出:
圖片
升級記錄表中新增了一條記錄
圖片
到此一個簡單的Flyway應用就完成了,接下來我們繼續(xù)Flyway在SpringBoot中更多用法。
3. Flyway其它用法
3.1 指定數(shù)據(jù)庫類型
我們可以通過如下配置來設置具體數(shù)據(jù)庫類型的腳本路徑
spring:
flyway:
locations:
- classpath:db/migration/{vendor}
通過{vendor}占位符,該占位符會更加你當前環(huán)境的數(shù)據(jù)庫類型自動替換,我們只需要在對應的路徑下建立文件夾及升級文件即可,如下:
圖片
3.2 使用其它數(shù)據(jù)庫
在默認情況下,F(xiàn)lyway使用的是你當前環(huán)境中主數(shù)據(jù)源(存在多個的時候,應用@Primary標記的數(shù)據(jù)源),我們可以通過如下兩種方式使用其它數(shù)據(jù)源(多數(shù)據(jù)源情況下):
- 自定義FlywayDataSource
@Bean
@FlywayDataSource
DataSource flywayDataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/msg?serverTimeznotallow=GMT%2B8&nullCatalogMeansCurrent=true&useSSL=false&characterEncoding=UTF-8");
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPoolName("flyway") ;
dataSource.setPassword("xxxooo");
return dataSource ;
}
通過使用@FlywayDataSource注解。
- 定義flyway數(shù)據(jù)源信息
spring:
flyway:
user: root
password: xxxooo
url: jdbc:mysql://localhost:3306/msg?serverTimeznotallow=GMT%2B8&nullCatalogMeansCurrent=true&useSSL=false
通過spring.flyway.*指定flyway自己的數(shù)據(jù)源。