數據庫版本管理框架-Flyway(從入門到精通)

一、flyway簡介

Flyway是一個簡單開源數據庫版本控制器(約定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客戶端等,還提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。

二、使用Flyway背景

部門開發一直是后端人員自行維護新增腳本,所以每次部署項目測試,都需要后端開發人員將 sql腳本在對應環境數據庫上執行一遍,這樣就造成有時候腳本文件混亂或者忘記執行,導致一些不必要的麻煩,所以就想要使用一款可以記錄SQL文件版本迭代的工具。

三、Springboot集成Flyway

廢話少說,我們直接開始進行Springboot的集成吧。
首先看一下Flyway執行流程:

1)Flyway 會掃描配置的腳本目錄下的腳本文件;
2)如果歷史記錄表不存在,則新建歷史記錄表;
3)如果是一次性執行腳本(V),按版本號從小到大執行遷移腳本,與當前歷史表中的版本號做對比,大于當前版本號的腳本才會被執行遷移;
4)如果是可重復執行腳本(R),檢查腳本是否有變動,有變動的可重復腳本才會被執行遷移;

1.引入依賴
Springboot2.x版本已經對Flyway有所依賴了,我們直接引入,不需要進行版本的申明,有時你寫上版本號還可能被項目自動覆蓋哦,這塊注意檢查一下。

<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId>
</dependency>

2.配置文件 yml
要遷移的數據庫的 DB url。 如果未設置,則使用主要配置的數據源,正常我們的項目都有jdbc的連接信息,我們使用默認就行,無需配置。

pring:flyway:# 開啟 flywayenabled: true# 檢測遷移腳本的路徑是否存在,如不存在,則拋出異常check-location: true# 是否禁用數據庫清理clean-disabled: true# SQL 遷移的編碼encoding: UTF-8# 遷移腳本的位置,默認db/migration.locations: classpath:flyway# 版本記錄信息表table: tb_flyway_history# SQL 遷移的文件名前綴。sql-migration-prefix: V# SQL 遷移的文件名分隔符。sql-migration-separator: __# SQL 遷移的文件名后綴。sql-migration-suffixes: .sql# 是否在執行遷移時自動調用驗證。validate-on-migrate: true# 遷移時發現目標schema非空,而且帶有沒有元數據的表時,是否自動執行基準遷移,默認false.baseline-on-migrate: true#如果不想用元數據的表明,可以更改元表名spring.flyway.table=test

3.新建flyway文件夾和sql文件


Flyway 的默認掃描遷移腳本目錄在:spring.flyway.locations: classpath:db/migration,用于掃描的遷移腳本目錄
Flyway 的默認版本變化記錄表名稱:spring.flyway.table: flyway_schema_history,用于記錄所有的版本變化記錄(可在配置文件中進行更改)

3.1 根據第2步配置了遷移腳本目錄,我們在 src/main resources 目錄下創建flyway目錄,如下圖:


3.2 下面我們創建兩個sql腳本,如上圖:
SQL腳本的命名規則(約定大于配置必須遵守)

命名規則主要有兩種:

1、僅需要被執行一次的SQL命名以大寫的"V"開頭,V+版本號(版本號的數字間以”.“或”_“分隔開)+雙下劃線(用來分隔版本號和描述)+文件描述+后綴名。例如: ?V20231100__create_user.sql、V2.1.5__create_user_ddl.sql、V4.1_2__add_user_dml.sql ?。
2、可重復運行的SQL,則以大寫的“R”開頭,后面再以兩個下劃線分割,其后跟文件名稱,最后以.sql結尾。(不推薦使用)比如: R__truncate_user_dml.sql 。
?

前綴:V用于版本化(可配置), U用于撤消(可配置)和 R用于可重復遷移(可配置)
版本:帶點或下劃線的版本可以根據需要分開多個部分(不適用于可重復的遷移)
分隔符 :( __兩個下劃線)(可配置)
描述:下劃線或空格分隔單詞
后綴:.sql(配置)

-- V1.0.0__user_create.sql 創建標簽表
DROP TABLE IF EXISTS tb_user;
CREATE TABLE `tb_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',`user_code` varchar(100) DEFAULT NULL COMMENT '用戶code',`user_name` varchar(50) DEFAULT NULL COMMENT '用戶名稱',`user_type` int(2) DEFAULT 3 COMMENT '用戶類型',`update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';-- V1.0.1__user_insert.sql 標簽表插入數據
INSERT INTO tb_user
(user_code, user_name, user_type)
values("U12345", "張三", 1);
四、啟動項目
2022-05-17 16:13:37.912||||[main] INFO ?o.f.core.internal.database.base.DatabaseType 49 - Database: jdbc:mysql://localhost:3366/db (MySQL 5.7)
2022-05-17 16:13:37.999||||[main] INFO ?org.flywaydb.core.internal.command.DbValidate 49 - Successfully validated 2 migrations (execution time 00:00.048s)
2022-05-17 16:13:38.025||||[main] INFO ?org.flywaydb.core.internal.command.DbMigrate 49 - Current version of schema `db`: << Empty Schema >>
2022-05-17 16:13:38.039||||[main] INFO ?org.flywaydb.core.internal.command.DbMigrate 49 - Migrating schema `db` to version "1.0.0 - create"
2022-05-17 16:13:38.123||||[main] INFO ?org.flywaydb.core.internal.command.DbMigrate 49 - Migrating schema `db` to version "1.0.1 - insert"
2022-05-17 16:13:38.157||||[main] INFO ?org.flywaydb.core.internal.command.DbMigrate 49 - Successfully applied 2 migrations to schema `db` (execution time 00:00.153s)

數據庫中flyway記錄歷史信息表如下:

五、 開發時注意事項

1.報錯后需要刪除flyway_schema_history中記錄,否則啟動失敗
2.V的優先級高于R,假如三個V遷移腳本和一個R(無論新建還是修改)一起執行,其中一個V報錯,則V會
全部執行完成且記錄到flyway_schema_history中,而R不執行且不記錄,刪除表中報錯記錄后,查詢啟
動,則執行原錯誤V和未執行的R
3.多個要執行的R中,如果出現了其中一個出現了錯誤,則在其后的R都不執行
4.R的執行順序根據命名來進行排序
5.一個文件中ddl并不由一個事務管理,比如創建三個表,中間創建表語句報錯,則第一個表還是會創建
成功并且提交事務
6.已經執行過的遷移文件(V)不能修改,否則報錯。
7.同一個遷移文件下同表內DDL無法回滾,DML可回滾, 從報錯點開始不往下執行,Flyway使用數據庫鎖
機制
8.版本號相同會報錯(Found more than one migration with version 1.0.0.9)
9.同一個遷移文件下假設都是dml,那么如果中間出現錯誤,所有的dml語句都會回滾
10.刪除sql文件后啟動會報錯,報錯如下


If you removed this migration intentionally, run repair to mark the migration as
deleted.
六、部署上線時注意事項

如果不手動創建元數據表,則需要進行以下配置,用于自動創建
validate-on-migrate: true
如果數據庫不是空表,則需進行以下配置,否則啟動報錯
baseline-on-migrate: true
clean命令會刪除數據庫中所有表,包括數據,結構等,這是不合理的,所以需要進行以下配置
clean-disabled: true (該配置由于默認值不合理,所以在V9版本中修改默認值由false為true)
使用flyway要注意版本兼容問題,springboot與flyway,flyway與數據庫版本,否則啟動報錯
如果啟動的時候像忽略某些遷移文件,可進行以下參數配置
baseline-version=20230809,以忽略 20230809 版本以及之前的所有 migration
多人開發中,如果一個人提交V2一個人提交V1,而V2先入庫執行了,那么V1入庫就不會執行,如果需要執行則需進行如下配置,但是不建議這么做
out-of-order=true

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209587.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209587.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209587.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCP對數據的拆分

應用程序的數據一般都比較大&#xff0c;因此TCP會按照網絡包的大小對數據進行拆分。 當發送緩沖區中的數據超過MSS的長度&#xff0c;數據會被以MSS長度為單位進行拆分&#xff0c;拆分出來的數據塊被放進單獨的網路包中。 根據發送緩沖區中的數據拆分情況&#xff0c;當判斷…

ffmpeg編譯問題

利用ffmpeg實現一個播放器&#xff0c;ffmpeg提供動態庫&#xff0c;但是編譯鏈接的時候遇到下面的問題&#xff1a; ../ffmpegWidgetPlayer/videoplayerwidget.cpp:23: error: undefined reference to sws_freeContext(SwsContext*) ../ffmpegWidgetPlayer/videoplayerwidget.…

JWT介紹及演示

JWT 介紹 cookie(放在瀏覽器) cookie 是一個非常具體的東西&#xff0c;指的就是瀏覽器里面能永久存儲的一種數據&#xff0c;僅僅是瀏覽器實現的一種數據存儲功能。 cookie由服務器生成&#xff0c;發送給瀏覽器&#xff0c;瀏覽器把cookie以kv形式保存到某個目錄下的文本…

JavaScript 金額元轉化為萬

function dealNum(price){if (price 0) {return 0元}const BASE 10000const decimal 0const SIZES ["", "萬", "億", "萬億"];let i undefined;let str "";if (price) {if ((price > 0 && price < BASE…

p標簽的水平居中和垂直居中

1行內塊元素水平居中垂直居中 行內元素和行內塊元素水平居中&#xff0c;給其父元素添加text-align:center&#xff1b;所以案例里面給one加了 text-align: center之后span就會水平居中了。在設置span行高和高都是一樣的 20px;這樣就實現上下居中了。 2塊級元素P元素水平居中…

通過命令行輸入參數控制激勵

1)在命令行的仿真參數&#xff08;SIM_OPT&#xff09;加上&#xff1a;“var_a100 var_b99” 2)在環境中調用&#xff1a; $test$plusargs("var_a")&#xff1b;如果命令行存在這個字符&#xff0c;返回1&#xff0c;否則返回0&#xff1b; $value$plusargs(&qu…

vue2 el-input里實現打字機 效果

vue2 el-input里實現打字機 效果 <el-col :span"24" v-if"ifshowOtherDesc""><el-form-item label"分析" prop"otherDesc"><el-input type"textarea" :disabled"disabled" autofocus"t…

藍牙物聯網對接技術難點有哪些?

#物聯網# 藍牙物聯網對接技術難點主要包括以下幾個方面&#xff1a; 1、設備兼容性&#xff1a;藍牙技術有多種版本和規格&#xff0c;如藍牙4.0、藍牙5.0等&#xff0c;不同版本之間的兼容性可能存在問題。同時&#xff0c;不同廠商生產的藍牙設備也可能存在兼容性問題。 2、…

0-1背包問題

二維版: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main {static int N 1010;static int[][] dp new int[N][N]; //dp[i][j] 只選前i件物品,體積 < j的最優解static int[] w new int[N]; //存儲價…

Day03 嵌入式---中斷

目錄 一、簡單介紹 二、總體框架 三、NVIC 3.2 NVIC的寄存器 3.3 中斷向量表 3.4 中斷優先級 3.5 NVIC優先級分組 3.6 NVIC配置 3.6.1、設置中斷分組 3.6.2、初始化 四、EXTI 外部中斷 4.1.EXTI的基本概念 4.2.EXTI的?作原理 4.3 EXTI配置 五、SYSCFG 5.1 SYS…

字符串函數`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模擬實現

文章目錄 &#x1f680;前言&#x1f680;庫函數strlen??strlen的模擬實現 &#x1f680;庫函數strcpy??strcpy的模擬實現 &#x1f680;strcmp??strcmp的模擬實現 &#x1f680;strstr??strstr的模擬實現 &#x1f680;strcat??strcat的模擬實現 &#x1f680;前言 …

ReactJS和VueJS的簡介以及它們之間的區別

本文主要介紹ReactJS和VueJS的簡介以及它們之間的區別。 目錄 ReactJS簡介ReactJS的優缺點ReactJS的應用場景VueJS簡介VueJS的優缺點VueJS的應用場景ReactJS和VueJS的區別 ReactJS簡介 ReactJS是一個由Facebook開發的基于JavaScript的前端框架。它是一個用于構建用戶界面的庫&…

【C語言】——函數遞歸,用遞歸簡化并實現復雜問題

文章目錄 前言一、什么是遞歸二、遞歸的限制條件三、遞歸舉例1.求n的階乘2. 舉例2&#xff1a;順序打印一個整數的每一位 四、遞歸的優劣總結 前言 不多廢話了&#xff0c;直接開始。 一、什么是遞歸 遞歸是學習C語言函數繞不開的?個話題&#xff0c;那什么是遞歸呢&#xf…

電商平臺商品銷量API接口,30天銷量API接口接口超詳細接入方案說明

電商平臺商品銷量API接口的作用主要是幫助開發者獲取電商平臺上的商品銷量信息。通過這個接口&#xff0c;開發者可以在自己的應用或網站中實時獲取商品的銷量數據&#xff0c;以便進行銷售分析、庫存管理、市場預測等操作。 具體來說&#xff0c;電商平臺商品銷量API接口的使…

RocketMq集成SpringBoot(待完善)

環境 jdk1.8, springboot2.7.3 Maven依賴 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/> <!-- lookup parent from…

vue3 筆記 - 聲明式 一

官網&#xff1a;Vue.js - 漸進式 JavaScript 框架 | Vue.js vue3編寫有聲明式和響應式。該文章僅記錄聲明式。vue3聲明式與vue2相同。 一、生命周期 創建之前 beforeCreate()已創建 created()掛載之前 beforeMount()已掛載 mounted()銷毀之前 beforeUnmount()已銷毀 unmoun…

java面試-Dubbo和zookeeper運行原理

遠離八股文&#xff0c;面試大白話&#xff0c;通俗且易懂 看完后試著用自己的話復述出來。有問題請指出&#xff0c;有需要幫助理解的或者遇到的真實面試題不知道怎么總結的也請評論中寫出來&#xff0c;大家一起解決。 java面試題匯總-目錄-持續更新中 分布式注冊中心和服務調…

Unity中后處理簡介

文章目錄 前言一、后處理的原理二、我們看一下Unity文檔中&#xff0c;內置的后處理前后的效果后處理前&#xff1a;后處理后&#xff1a; 前言 我們在這篇文章中&#xff0c;了解一下Unity中的后處理效果 后期處理概述 一、后處理的原理 在后處理的過程中&#xff0c;我們主…

Java當中常用的算法

文章目錄 算法二叉樹左右變換數據二分法實現 冒泡排序算法插入排序算法快速排序算法希爾排序算法歸并排序算法桶排序算法基數排序算法分治算法漢諾塔問題動態規劃算法引子代碼實現背包問題 KMP算法什么是KMP算法暴力匹配KMP算法實現 今天我們來看看常用的算法&#xff0c;開干。…

《微信小程序開發從入門到實戰》學習四十五

4.4 云函數 云函數是開發者提前定義好的、保存在云端并且將在云端運行的JS函數。 開發者先定義好云函數&#xff0c;再使用微信開發工具將云函數上傳到云空間&#xff0c;在云開發控制臺中可看到已經上傳的云函數。 云函數運行在云端Node.js環境中。 小程序端通過wx.cloud.…