深入理解Spring?Boot中的Flyway
Flyway 介紹
Flyway 是一個(gè)開源的數(shù)據(jù)庫遷移工具,MySQL, SQL Server, Oracle 等二十多種數(shù)據(jù)庫
在 Flyway 中數(shù)據(jù)庫的所有改變均稱為遷移(migration),遷移分為兩種:基于版本控制的遷移(versioned)和可重復(fù)執(zhí)行的遷移(repeatable)?;诎姹究刂频挠址譃閮煞N:常規(guī)遷移(regular)和撤銷遷移(undo)
基于版本控制的遷移
包含版本(version)、描述(description )和總和校驗(yàn)碼(checksum)。版本必須是唯一的(可以是遞增的數(shù)字或者小版本,如1.2.3等),總和校驗(yàn)碼的作用是在 Flyway 會(huì)逐個(gè)對(duì)比之前執(zhí)行過的腳本的是否被修改,如果被修改則校驗(yàn)碼結(jié)果不同,會(huì)報(bào) checksum mismatch 錯(cuò)誤,因此執(zhí)行過的腳本不應(yīng)該再修改,如果需要對(duì)已有數(shù)據(jù)表修改,應(yīng)該新建一個(gè)腳本執(zhí)行;基于版本控制的遷移僅按照版本的順序執(zhí)行一次,如果需要撤銷,可以提供相同版本的撤銷遷移來處理
可重復(fù)執(zhí)行的遷移
包含描述(description )和總和校驗(yàn)碼(checksum),但是沒有版本(version)。每當(dāng)校驗(yàn)碼發(fā)生變化(即文件被修改)時(shí)均會(huì)執(zhí)行,而不是僅執(zhí)行一次;在單次遷移中,可重復(fù)執(zhí)行的遷移按照描述的順序在其他腳本執(zhí)行后再執(zhí)行
遷移的實(shí)現(xiàn)方式又分為兩種:基于 SQL 腳本(SQL-based)的遷移和基于 Java 代碼(Java-based)的遷移
基于 SQL 腳本的遷移
命名規(guī)則:[前綴][版本號(hào)][分隔符][描述][后綴],如:V2__Add_new_table.sql,R__Add_new_table.sql
- 前綴:常規(guī)遷移是 V,撤銷遷移是 U,可重復(fù)執(zhí)行的遷移 是 R;前綴是可配置的
- 版本號(hào):使用下劃線或者小數(shù)點(diǎn)分割
- 分隔符:默認(rèn)是兩個(gè)下劃線(可配置)
- 描述:使用下劃線或者空格分割
- 后綴:默認(rèn)是 .sql (可配置)
配置參數(shù) validateMigrationNaming 用來配置命名不符合規(guī)范的處理方式:true 忽略不符合規(guī)范的文件,false 快速失敗
基于 Java 代碼的遷移
命名規(guī)則:[前綴][版本號(hào)][分隔符][描述],如:V2__Add_new_table,R__Add_new_table
- 前綴:常規(guī)遷移是 V,撤銷遷移是 U,可重復(fù)執(zhí)行的遷移 是 R;前綴是可配置的
- 版本號(hào):使用下劃線分割(下劃線在運(yùn)行時(shí)會(huì)自動(dòng)替換為小數(shù)點(diǎn))
- 分隔符:兩個(gè)下劃線
- 描述:使用下劃線分割(下劃線在運(yùn)行時(shí)會(huì)自動(dòng)替換為空格)
Flyway 是一款開源的數(shù)據(jù)庫版本管理工具,用于管理和自動(dòng)化數(shù)據(jù)庫結(jié)構(gòu)的變更。它可以跟蹤和管理數(shù)據(jù)庫的版本控制,并在應(yīng)用程序啟動(dòng)時(shí)自動(dòng)執(zhí)行升級(jí)或回滾操作。
使用Flyway,你可以將數(shù)據(jù)庫的變更以可重復(fù)且可控的方式應(yīng)用到不同環(huán)境中,如開發(fā)、測(cè)試和生產(chǎn)環(huán)境。它支持多種數(shù)據(jù)庫系統(tǒng),包括MySQL、Oracle、PostgreSQL、SQL Server等。
Flyway將數(shù)據(jù)庫結(jié)構(gòu)的變更定義為一系列遷移腳本,通常是SQL腳本文件。每個(gè)遷移腳本都有一個(gè)唯一的版本號(hào),F(xiàn)lyway會(huì)按照版本號(hào)的順序依次執(zhí)行這些腳本,以達(dá)到數(shù)據(jù)庫結(jié)構(gòu)的變更和更新。當(dāng)應(yīng)用程序啟動(dòng)時(shí),F(xiàn)lyway會(huì)自動(dòng)檢測(cè)并執(zhí)行未應(yīng)用的遷移腳本,將數(shù)據(jù)庫升級(jí)到最新版本。如果需要回滾到之前的版本,F(xiàn)lyway也提供了回滾操作的支持。
通過使用Flyway,開發(fā)團(tuán)隊(duì)可以更好地管理數(shù)據(jù)庫結(jié)構(gòu)的變更,保持不同環(huán)境之間的數(shù)據(jù)庫一致性,并輕松地進(jìn)行版本控制和追蹤。
官方文檔:https://documentation.red-gate.com/fd/
Flyway 工作流程
- 1、檢測(cè)數(shù)據(jù)庫狀態(tài):Flyway會(huì)連接到配置的數(shù)據(jù)庫,并檢測(cè)當(dāng)前數(shù)據(jù)庫的狀態(tài),包括已應(yīng)用的遷移腳本版本和未應(yīng)用的遷移腳本。
- 2、執(zhí)行遷移腳本:Flyway會(huì)將未應(yīng)用的遷移腳本按照版本號(hào)的順序逐一執(zhí)行。它會(huì)查找項(xiàng)目中指定的遷移腳本目錄(默認(rèn)為db/migration),并依次運(yùn)行其中的SQL腳本。
- 3、更新數(shù)據(jù)庫狀態(tài):每當(dāng)一個(gè)遷移腳本成功執(zhí)行后,F(xiàn)lyway會(huì)將其記錄為已應(yīng)用的腳本,并將其版本號(hào)存儲(chǔ)在數(shù)據(jù)庫的元數(shù)據(jù)表( flyway_schema_history)中,以便下次啟動(dòng)時(shí)進(jìn)行跟蹤和管理。
Spring Boot集成Flyway
1、添加依賴
在項(xiàng)目的pom.xml文件中,添加Flyway的Maven依賴,如果是springboot 2.xx,使用5.2.1或5.2.4:
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>${flyway-core.version}</version> </dependency>
2、數(shù)據(jù)庫連接信息配置
在Spring Boot項(xiàng)目的application.properties或者application.yml文件中配置數(shù)據(jù)庫的連接信息,例如:
spring.datasource.url=jdbc:mysql://localhost:3306/db_example spring.datasource.username=dbuser spring.datasource.password=dbpass
3、Flyway配置
在Spring Boot項(xiàng)目的application.properties或者application.yml文件中進(jìn)行Flyway的相關(guān)配置,例如
# Flyway配置 #開啟flyway功能,默認(rèn)為true spring.flyway.enabled=true # 用于存儲(chǔ)遷移歷史記錄的表名,默認(rèn)為flyway_schema_history spring.flyway.table=flyway_schema_history # 遷移腳本編碼,默認(rèn)為UTF-8 spring.flyway.encoding=UTF-8 # 當(dāng)遷移數(shù)據(jù)庫存在但沒有元數(shù)據(jù)的表時(shí),自動(dòng)執(zhí)行基準(zhǔn)遷移,新建flyway_schema_history表 spring.flyway.baseline-on-migrate=true # 數(shù)據(jù)庫遷移腳本的位置,默認(rèn)為classpath:db/migration spring.flyway.locations=classpath:db/migration # SQL遷移腳本文件名前綴,默認(rèn)為V spring.flyway.sql-migration-prefix=V # SQL遷移腳本文件名后綴,默認(rèn)為.sql spring.flyway.sql-migration-suffixes=.sql # 是否在遷移時(shí)驗(yàn)證腳本,默認(rèn)為true spring.flyway.validate-on-migrate=true # 檢測(cè)遷移腳本的路徑是否存在,默認(rèn)為true,如不存在,則拋出異常,如果不想拋出異常可設(shè)為flase spring.flyway.check-location=false # 用于控制是否禁用 Flyway 的 clean 操作。 spring.flyway.clean-disabled=true
大家可以按照自己的需求來進(jìn)行配置,上述配置除了spring.flyway.baseline-on-migrate和spring.flyway.clean-disabled,其他都比較見名知義,所以下面講解下
spring.flyway.baseline-on-migrate
當(dāng)spring.flyway.baseline-on-migrate屬性設(shè)置為true時(shí),F(xiàn)lyway會(huì)自動(dòng)創(chuàng)建一個(gè)名為flyway_schema_history的表,并將當(dāng)前數(shù)據(jù)庫的schema版本設(shè)置為目前最新的遷移腳本版本。
具體來說,這個(gè)屬性的作用包括:
- 當(dāng)數(shù)據(jù)庫中不存在遷移歷史記錄表時(shí),F(xiàn)lyway 會(huì)自動(dòng)創(chuàng)建該表,并將當(dāng)前已經(jīng)存在的數(shù)據(jù)庫對(duì)象標(biāo)記為已遷移狀態(tài)。
- 當(dāng)數(shù)據(jù)庫中存在遷移歷史記錄表,但版本號(hào)低于最新的遷移腳本版本時(shí),F(xiàn)lyway 也會(huì)自動(dòng)創(chuàng)建一個(gè)基線版本,從而將現(xiàn)有的數(shù)據(jù)庫對(duì)象標(biāo)記為已遷移狀態(tài),并開始應(yīng)用最新的遷移腳本。
這樣做的目的是確保在已有數(shù)據(jù)庫上使用 Flyway 進(jìn)行遷移時(shí),無論數(shù)據(jù)庫是否已經(jīng)有遷移歷史記錄,都能夠正確地進(jìn)行遷移操作。這在初始化應(yīng)用程序時(shí)特別有用,因?yàn)樗试S你在部署應(yīng)用程序到新環(huán)境時(shí),自動(dòng)初始化數(shù)據(jù)庫并應(yīng)用最新的遷移腳本。
spring.flyway.clean-disabled
spring.flyway.clean-disabled 用于控制是否禁用 Flyway 的 clean 操作。
clean 操作是 Flyway 的一個(gè)功能,可以清空數(shù)據(jù)庫中的所有對(duì)象(比如表、視圖、存儲(chǔ)過程等),以便進(jìn)行全新的數(shù)據(jù)庫遷移。在開發(fā)和測(cè)試階段,這可能是有用的,因?yàn)樗梢源_保每次都從一個(gè)干凈的數(shù)據(jù)庫狀態(tài)開始運(yùn)行。但在生產(chǎn)環(huán)境中,執(zhí)行 clean 操作可能會(huì)導(dǎo)致數(shù)據(jù)丟失,因此通常需要禁用它。
4、創(chuàng)建遷移腳本
在項(xiàng)目的src/main/resources/db/migration目錄下創(chuàng)建數(shù)據(jù)庫遷移腳本,命名規(guī)范為V1__Description.sql,其中V1是版本號(hào),Description是描述。例如,可以創(chuàng)建一個(gè)V1.1__CreateTable.sql的文件來創(chuàng)建表。
Flyway 的 SQL 腳本命名規(guī)則:
- 版本號(hào):SQL 腳本的文件名應(yīng)該以一個(gè)版本號(hào)開頭,版本號(hào)可以是數(shù)字序列或者帶有點(diǎn)號(hào)分隔的數(shù)字序列,用來表示數(shù)據(jù)庫結(jié)構(gòu)的變更順序。例如,V1.1__Create_Table.sql 或 V1.2__Add_Column.sql。
- 描述性名稱:在版本號(hào)之后,使用雙下劃線 __ 分隔,并在其后添加描述性的名稱,用來清晰地表明這個(gè)腳本的作用。例如,V1__Create_Table.sql 中的 “Create_Table” 就是一個(gè)描述性的名稱。
根據(jù)以上的命名規(guī)則,F(xiàn)lyway 會(huì)按照版本號(hào)的順序依次執(zhí)行 SQL 腳本。在 SQL 腳本的編寫中,你可以包含所有標(biāo)準(zhǔn)的 SQL 語句,比如 CREATE TABLE、ALTER TABLE、INSERT 等,以及適用于特定數(shù)據(jù)庫的特性和語法。
如果我們一個(gè)版本下有多個(gè)文件,那還可以在版本后面使用序號(hào)來區(qū)分排序
實(shí)例:V1.1.0版本下,001為創(chuàng)建腳本,002為更新腳本
V1.1.0_001__create_table.sql V1.1.0_002__insert_table.sql
Flyway 還提供了一種特殊的 SQL 腳本命名規(guī)則,用于標(biāo)識(shí)可重復(fù)執(zhí)行的 SQL 腳本。這種命名規(guī)則是基于前綴 R__ 的方式,以大寫的“R”開頭,后面再以兩個(gè)下劃線分割,其后跟文件名稱,最后以.sql結(jié)尾
命名規(guī)則如下:
格式:R__<描述>.sql 示例:R__Initialize_Data.sql、R__Cleanup_Data.sql
可重復(fù)執(zhí)行的 SQL 腳本指的是可以在任何數(shù)據(jù)庫版本上多次運(yùn)行而不會(huì)造成影響的腳本,通常用于執(zhí)行一些初始化或數(shù)據(jù)清理等操作。
5、啟動(dòng)項(xiàng)目,flyway執(zhí)行腳本
當(dāng)我們把spring.flyway.baseline-on-migrate屬性設(shè)為true的時(shí)候,第一次啟動(dòng)項(xiàng)目會(huì)為我們創(chuàng)建flyway_schema_history表,并執(zhí)行相應(yīng)的腳本
下面是表的字段說明
installed_rank:已安裝的遷移腳本的排名(從 1 開始)。 version:遷移腳本的版本號(hào)。 description:遷移腳本的描述。 type:遷移腳本的類型(SQL、JAVA 等)。 script:遷移腳本的文件名。 checksum:遷移腳本的校驗(yàn)和。 installed_by:安裝遷移腳本的用戶。 installed_on:安裝遷移腳本的時(shí)間戳。 execution_time:執(zhí)行遷移腳本所需的時(shí)間(以毫秒為單位)。 success:表示遷移腳本是否成功安裝。
說明,如果我們是spring.flyway.baseline-on-migrate=true自動(dòng)生成的flyway_schema_history表,那么version字段默認(rèn)值為1,此時(shí)的sql腳本必須比1大才會(huì)執(zhí)行,比如V1.1,V1.1.0,V2等,如果使用V1命名我們的sql腳本,則腳本不會(huì)執(zhí)行
到此這篇關(guān)于深入理解Spring Boot中的Flyway的文章就介紹到這了,更多相關(guān)Spring Boot集成Flyway內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)的方式
在spring?boot中,可以通過@EnableScheduling注解和@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù),也可以通過SchedulingConfigurer接口來實(shí)現(xiàn)定時(shí)任務(wù),但是這兩種方式不能動(dòng)態(tài)添加、刪除、啟動(dòng)、停止任務(wù),本文給大家介紹SpringBoot實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)的方式,感興趣的朋友一起看看吧2024-03-03Java?Web防止同一用戶同時(shí)登錄幾種常見的實(shí)現(xiàn)方式
在JavaWeb開發(fā)中,實(shí)現(xiàn)同一賬號(hào)同一時(shí)間只能在一個(gè)地點(diǎn)登錄的功能,主要目的是為了增強(qiáng)系統(tǒng)的安全性,防止用戶賬戶被他人惡意登錄或同時(shí)在多個(gè)設(shè)備上使用,這篇文章主要給大家介紹了關(guān)于Java?Web防止同一用戶同時(shí)登錄幾種常見的實(shí)現(xiàn)方式,需要的朋友可以參考下2024-08-08如何基于springcloud模擬RPC調(diào)用(Feign)
這篇文章主要介紹了如何基于springcloud模擬RPC調(diào)用(Feign),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04java實(shí)現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù)
今天小編就為大家分享一篇java實(shí)現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Java8中Lambda表達(dá)式使用和Stream API詳解
這篇文章主要給大家介紹了關(guān)于Java8中Lambda表達(dá)式使用和Stream API的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05如何通過一個(gè)注解實(shí)現(xiàn)MyBatis字段加解密
用戶隱私很重要,因此很多公司開始做數(shù)據(jù)加減密改造,下面這篇文章主要給大家介紹了關(guān)于如何通過一個(gè)注解實(shí)現(xiàn)MyBatis字段加解密的相關(guān)資料,需要的朋友可以參考下2022-02-02Springboot Cucumber測(cè)試配置介紹詳解
這篇文章主要介紹了Springboot Cucumber測(cè)試配置介紹詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04