欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Spring?Boot中的Flyway

 更新時(shí)間:2024年01月28日 10:07:29   作者:way_more  
Flyway將數(shù)據(jù)庫結(jié)構(gòu)的變更定義為一系列遷移腳本,通常是SQL腳本文件,當(dāng)應(yīng)用程序啟動(dòng)時(shí),F(xiàn)lyway會(huì)自動(dòng)檢測(cè)并執(zhí)行未應(yīng)用的遷移腳本,將數(shù)據(jù)庫升級(jí)到最新版本,這篇文章主要介紹了深入理解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ù)的方式

    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-03
  • Java?Web防止同一用戶同時(shí)登錄幾種常見的實(shí)現(xiàn)方式

    Java?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)

    這篇文章主要介紹了如何基于springcloud模擬RPC調(diào)用(Feign),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java多線程之Future設(shè)計(jì)模式

    Java多線程之Future設(shè)計(jì)模式

    這篇文章主要介紹了Java多線程之Future設(shè)計(jì)模式,F(xiàn)uture 代表的是未來的一個(gè)憑據(jù),文章主要附上Future具體實(shí)現(xiàn)類、橋接Future和FutureTask的代碼,需要的朋友可以參考一下
    2021-10-10
  • Java面向?qū)ο蠡A(chǔ)知識(shí)之枚舉

    Java面向?qū)ο蠡A(chǔ)知識(shí)之枚舉

    這篇文章主要介紹了Java面向?qū)ο蟮闹杜e,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-11-11
  • java實(shí)現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù)

    java實(shí)現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù)

    今天小編就為大家分享一篇java實(shí)現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • java如何去除圖片中的白色背景

    java如何去除圖片中的白色背景

    這篇文章主要為大家詳細(xì)介紹了java去除圖片中白色背景的方法,教大家如何將圖片中的白色背景去掉,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Java8中Lambda表達(dá)式使用和Stream API詳解

    Java8中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字段加解密

    如何通過一個(gè)注解實(shí)現(xiàn)MyBatis字段加解密

    用戶隱私很重要,因此很多公司開始做數(shù)據(jù)加減密改造,下面這篇文章主要給大家介紹了關(guān)于如何通過一個(gè)注解實(shí)現(xiàn)MyBatis字段加解密的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • Springboot Cucumber測(cè)試配置介紹詳解

    Springboot Cucumber測(cè)試配置介紹詳解

    這篇文章主要介紹了Springboot Cucumber測(cè)試配置介紹詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04

最新評(píng)論