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