日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

瀏覽:26日期:2022-08-09 10:25:11
為什么要用Flyway

在日常開發(fā)中,我們經常會遇到下面的問題:

自己寫的SQL忘了在所有環(huán)境執(zhí)行; 別人寫的SQL我們不能確定是否都在所有環(huán)境執(zhí)行過了; 有人修改了已經執(zhí)行過的SQL,期望再次執(zhí)行; 需要新增環(huán)境做數(shù)據遷移; 每次發(fā)版需要手動控制先發(fā)DB版本,再發(fā)布應用版本;

其它場景...

由于項目需求的變化,或者前期設計缺陷,導致在后期需要修改數(shù)據庫,這應該是一個比較常見的事情,如果項目還沒上線,你可能把表刪除了重新創(chuàng)建,但是如果項目已經上線了,就不能這樣簡單粗暴了,每次運維部署項目,還得手動執(zhí)行一遍SQL文件。我們需要通過 SQL 腳本在已有數(shù)據表的基礎上進行升級。

有了flyway,這些問題都能得到很好的解決。

使用了 Flyway 之后,如果再想進行數(shù)據庫版本升級,就不用該以前的數(shù)據庫腳本了,直接創(chuàng)建新的數(shù)據庫腳本,項目在啟動時檢測了有新的更高版本的腳本,就會自動執(zhí)行,這樣,在和其他同事配合工作時,也會方便很多。因為正常我們都是從 Git 上拉代碼下來,不拉數(shù)據庫腳本,這樣要是有人更新了數(shù)據庫,其他同事不一定能夠收到最新的通知,使用了 Flyway 就可以有效避免這個問題了。

所有的腳本,一旦執(zhí)行了,就會在 flyway_schema_history 表中有記錄,如果你不小心搞錯了,可以手動從 flyway_schema_history 表中刪除記錄,然后修改 SQL 腳本后再重新啟動(生產環(huán)境不建議)。

Flyway是如何工作的

Flyway工作流程如下:

1、項目啟動,應用程序完成數(shù)據庫連接池的建立后,F(xiàn)lyway自動運行。

2、初次使用時,F(xiàn)lyway會創(chuàng)建一個flyway_schema_history表,用于記錄sql執(zhí)行記錄。

3、Flyway會掃描項目指定路徑下(默認是classpath:db/migration)的所有sql腳本,與flyway_schema_history表腳本記錄進行比對。如果數(shù)據庫記錄執(zhí)行過的腳本記錄,與項目中的sql腳本不一致,F(xiàn)lyway會報錯并停止項目執(zhí)行。

4、如果校驗通過,則根據表中的sql記錄最大版本號,忽略所有版本號不大于該版本的腳本。再按照版本號從小到大,逐個執(zhí)行其余腳本。

項目中使用Flyway

首先,在pom文件中引入flyway的核心依賴包:

1、引入核心依賴包:

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

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

這里使用5.2.4版本。經測試7.0.0版本與目前我們使用的springboot版本有沖突,會導致flyway不執(zhí)行。因此我們盡量不要使用高版本的flyway。

2、配置文件:

簡單配置一個屬性即可使用

# flyway 配置 spring: flyway: # 啟用或禁用 flyway enabled: true # flyway 的 clean 命令會刪除指定 schema 下的所有 table, 生產務必禁掉。這個默認值是 false 理論上作為默認配置是不科學的。 clean-disabled: true # SQL 腳本的目錄,多個路徑使用逗號分隔 默認值 classpath:db/migration locations: classpath:db/migration # metadata 版本控制信息表 默認 flyway_schema_history table: flyway_schema_history # 如果沒有 flyway_schema_history 這個 metadata 表, 在執(zhí)行 flyway migrate 命令之前, 必須先執(zhí)行 flyway baseline 命令 # 設置為 true 后 flyway 將在需要 baseline 的時候, 自動執(zhí)行一次 baseline。 baseline-on-migrate: true # 指定 baseline 的版本號,默認值為 1, 低于該版本號的 SQL 文件, migrate 時會被忽略 baseline-version: 1 # 字符編碼 默認 UTF-8 encoding: UTF-8 # 是否允許不按順序遷移 開發(fā)建議 true 生產建議 false out-of-order: false # 需要 flyway 管控的 schema list,這里我們配置為flyway 缺省的話, 使用spring.datasource.url 配置的那個 schema, # 可以指定多個schema, 但僅會在第一個schema下建立 metadata 表, 也僅在第一個schema應用migration sql 腳本. # 但flyway Clean 命令會依次在這些schema下都執(zhí)行一遍. 所以 確保生產 spring.flyway.clean-disabled 為 true schemas: flyway # 執(zhí)行遷移時是否自動調用驗證 當你的 版本不符合邏輯 比如 你先執(zhí)行了 DML 而沒有 對應的DDL 會拋出異常 validate-on-migrate: true

flyway的properties配置清單(屬性未測試):

# 對執(zhí)行遷移時基準版本的描述. flyway.baseline-description #當遷移時發(fā)現(xiàn)目標schema非空,而且?guī)в袥]有元數(shù)據的表時,是否自動執(zhí)行基準遷移,默認false. flyway.baseline-on-migrate =false #開始執(zhí)行基準遷移時對現(xiàn)有的schema的版本打標簽,默認值為1. flyway.baseline-version=1 #檢查遷移腳本的位置是否存在,默認false. flyway.check-location=false #當發(fā)現(xiàn)校驗錯誤時是否自動調用clean,默認false. flyway.clean-on-validation-error=false #是否開啟flywary,默認true. flyway.enabled=true #設置遷移時的編碼,默認UTF-8. flyway.encoding #當讀取元數(shù)據表時是否忽略錯誤的遷移,默認false. flyway.ignore-failed-future-migration #當初始化好連接時要執(zhí)行的SQL. flyway.init-sqls #遷移腳本的位置,默認db/migration. flyway.locations #是否允許無序的遷移,默認false. flyway.out-of-order #目標數(shù)據庫的密碼. flyway.password #設置每個placeholder的前綴,默認${. flyway.placeholder-prefix #是否要被替換,默認true. flyway.placeholder-replacementplaceholders #設置每個placeholder的后綴,默認}. flyway.placeholder-suffix #設置placeholder的value flyway.placeholders.[placeholder name] #設定需要flywary遷移的schema,大小寫敏感,默認為連接默認的schema. flyway.schemas #遷移文件的前綴,默認為V. flyway.sql-migration-prefix #遷移腳本的文件名分隔符,默認__ flyway.sql-migration-separator #遷移腳本的后綴,默認為.sql flyway.sql-migration-suffix #使用的元數(shù)據表名,默認為schema_version flyway.tableflyway #遷移時使用的目標版本,默認為latest version flyway.target #遷移時使用的JDBC URL,如果沒有指定的話,將使用配置的主數(shù)據源 flyway.url #遷移數(shù)據庫的用戶名 flyway.user #遷移時是否校驗,默認為true flyway.validate-on-migrate

flyway的yml配置清單(已測試,沒問題,推薦使用yml格式的配置文件)

# flyway 配置 spring: flyway: # 啟用或禁用 flyway enabled: true # flyway 的 clean 命令會刪除指定 schema 下的所有 table, 生產務必禁掉。這個默認值是 false 理論上作為默認配置是不科學的。 clean-disabled: true # SQL 腳本的目錄,多個路徑使用逗號分隔 默認值 classpath:db/migration locations: classpath:db/migration # metadata 版本控制信息表 默認 flyway_schema_history table: flyway_schema_history # 如果沒有 flyway_schema_history 這個 metadata 表, 在執(zhí)行 flyway migrate 命令之前, 必須先執(zhí)行 flyway baseline 命令 # 設置為 true 后 flyway 將在需要 baseline 的時候, 自動執(zhí)行一次 baseline。 baseline-on-migrate: true # 指定 baseline 的版本號,默認值為 1, 低于該版本號的 SQL 文件, migrate 時會被忽略 baseline-version: 1 # 字符編碼 默認 UTF-8 encoding: UTF-8 # 是否允許不按順序遷移 開發(fā)建議 true 生產建議 false out-of-order: false # 需要 flyway 管控的 schema list,這里我們配置為flyway 缺省的話, 使用spring.datasource.url 配置的那個 schema, # 可以指定多個schema, 但僅會在第一個schema下建立 metadata 表, 也僅在第一個schema應用migration sql 腳本. # 但flyway Clean 命令會依次在這些schema下都執(zhí)行一遍. 所以 確保生產 spring.flyway.clean-disabled 為 true schemas: flyway # 執(zhí)行遷移時是否自動調用驗證 當你的 版本不符合邏輯 比如 你先執(zhí)行了 DML 而沒有 對應的DDL 會拋出異常 validate-on-migrate: true

spring.flyway.clean-disabled:這個屬性非常關鍵,它表示是否要清除已有庫下的表,如果執(zhí)行的腳本是 V1__xxx.sql,那么會先清除已有庫下的表,然后再執(zhí)行腳本,這在開發(fā)環(huán)境下還挺方便,但是在生產環(huán)境下就要命了,而且它默認就是要清除,生產環(huán)境一定要自己配置設置為 true。

3、創(chuàng)建db/migration

因為flyway默認是讀取resources/db/migration下的文件夾,如果我們需要修改這個路徑,可以在配置文件中實現(xiàn)

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

4、編寫sql文件

此處的SQL語句命名需要遵從一定的規(guī)范,否則運行的時候flyway會報錯。命名規(guī)則主要有兩種:

僅需要被執(zhí)行一次的SQL命名以大寫的'V'開頭,后面跟上'0~9'數(shù)字的組合,數(shù)字之間可以用“.”或者下劃線'_'分割開,然后再以兩個下劃線 __ 分割,其后跟文件名稱,最后以.sql結尾。比如,V20210707__create_user.sql、V20210707__add_user.sql。 可重復運行的SQL,則以大寫的“R”開頭,后面再以兩個下劃線分割,其后跟文件名稱,最后以.sql結尾。。比如,R__truncate_user_dml.sql。

其中,V開頭的SQL執(zhí)行優(yōu)先級要比R開頭的SQL優(yōu)先級高。

V:固定大寫

20210707.01:20210707是日期,后面用.01代表序號

因為flyway的執(zhí)行是有個順序的,比如你執(zhí)行了V2021__create_user,又執(zhí)行V2020_update_user。就會報錯,原因就是2020<2021。所以我們要保證序號是依次增大。

Flyway 是如何比較兩個 SQL 文件的先后順序呢?它采用 采用左對齊原則, 缺位用 0 代替 。舉幾個例子:

1.0.1.1 比 1.0.1 版本高。 ​ 1.0.10 比 1.0.9.4 版本高。 ​ 1.0.10 和 1.0.010 版本號一樣高, 每個版本號部分的前導 0 會被忽略。

__:這個是兩個 _

create_user是一個簡單的sql描述

.sql:以.sql結尾的文件后綴是約定

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

我們只要在數(shù)據庫中創(chuàng)建flyway這個數(shù)據庫,啟動項目,flyway就會執(zhí)行sql文件,創(chuàng)建user表,并且會自動生成一個flyway_schema_history表

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

從這段啟動日志中,我們可以看到 Flyway 的執(zhí)行信息,數(shù)據庫腳本的執(zhí)行執(zhí)行,同時這里還說了,F(xiàn)lyway 還給創(chuàng)建了一個 flyway_schema_history 表,這個表用來記錄數(shù)據庫的更新歷史。

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

flyway_schema_history里面會去記錄sql文件的執(zhí)行記錄,每次啟動項目,都會去flyway_schema_history看sql是否執(zhí)行過,如果沒有執(zhí)行過,說明這個sql是新的sql,就會自動執(zhí)行,并且記錄到表里面。

flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

有了這條記錄,下次再啟動項目,V20210707.01、V20210707.02、V20210708.01 這個三個腳本文件就不會執(zhí)行了,因為系統(tǒng)知道這個腳本已經執(zhí)行過了,如果你還想讓這些腳本再執(zhí)行一遍,需要手動刪除 flyway_schema_history 表中的對應記錄,那么項目啟動時,這個腳本就會被執(zhí)行了。

R開頭的文件和V開頭的文件略有不同,R開頭的文件只要發(fā)送修改,都會執(zhí)行一遍。V開頭的文件如果執(zhí)行過一般,在發(fā)送修改,就會報錯。為了控制版本,我們盡量使用V開頭的文件,這樣我們也可以很清楚的看到每個版本中的sql文件。

常見問題

問題1

flyway遇到的問題Caused by: java.lang.ClassNotFoundException: org.flywaydb.core.api.callback.FlywayCallbac

原因:springboot版本和flyway版本不一致,一般是flyway版本過高。

解決辦法:將flyway的版本降到5.2.4就ok了

問題2

springboot 整合flyway 但是不生效,flyway不會自動執(zhí)行sql

原因:如上

原因2:項目中沒有配置數(shù)據庫,沒有引入sq依賴或者配置

解決辦法:如上

解決辦法2:引入sql依賴,在yml文件中配置sql信息

問題3

flyway出錯 FlywayException: Validate failed: Detected failed migration to version

原因:sql腳本和數(shù)據庫中有沖突,需要檢查sql腳本哪里錯了。簡單的說就是V開頭的sql文件,已經執(zhí)行過了,在 flyway_schema_history 表里面有這個數(shù)據,但是你又改動了sql文件,導致再次執(zhí)行的時候報錯。

解決辦法:新建一個sql文件,不要修改原來以V開頭的文件或者在flyway_schema_history表中找到文件相關執(zhí)行記錄,刪掉重新執(zhí)行。

作者:天下沒有收費的bug出處:https://www.cnblogs.com/LoveBB/本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文鏈接,否則保留追究法律責任的權利。

到此這篇關于flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法的文章就介紹到這了,更多相關java 自動升級SQL腳本內容請搜索好吧啦網以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩国产一区精品一区| 亚洲精品激情| 亚欧成人精品| 中文字幕中文字幕精品| 免费欧美在线视频| 国产农村妇女精品一二区| 久久av一区二区三区| 亚洲一区国产| 天堂va欧美ⅴa亚洲va一国产| 亚洲18在线| 国产精品一国产精品| 精品在线网站观看| 在线一区av| 日韩av免费| 99国产精品私拍| 亚洲18在线| 欧美黄页在线免费观看 | 石原莉奈一区二区三区在线观看| 亚洲综合另类| 青草综合视频| 国产精品麻豆久久| 国产字幕视频一区二区| 美女国产一区| 久久国产三级精品| 国产精品不卡| 99在线观看免费视频精品观看| 亚洲影视一区二区三区| 国产情侣久久| 日韩免费福利视频| 亚洲精品在线观看91| 亚洲色图综合| 精品在线91| 日本亚洲不卡| 日韩av午夜在线观看| 国产成人在线中文字幕| 99re国产精品| 91免费精品| 久久一区国产| 99久久精品费精品国产| 色婷婷久久久| 亚洲欧美综合| 精品成人免费一区二区在线播放| av亚洲免费| 日韩精品第二页| 韩国精品主播一区二区在线观看| 国产精品15p| 嫩草伊人久久精品少妇av杨幂| 国产精品国产三级在线观看| 精品九九在线| 久久高清免费| 国产精品午夜一区二区三区| 久久不射中文字幕| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 亚洲美女91| 国产精品久久久久av蜜臀| 午夜精品成人av| 在线亚洲成人| 国产精品s色| 日韩深夜视频| 91精品丝袜国产高跟在线| 久久激情五月婷婷| 吉吉日韩欧美| 中国女人久久久| 国产精品久久久久久久久久久久久久久| 国产精品日本一区二区不卡视频| 91精品国产自产观看在线| 久久精品九色| 中文精品视频| 国产精品久久久亚洲一区| 激情综合激情| 欧美国产先锋| 五月天久久久| 国产精品激情电影| 欧美资源在线| 日本少妇一区| 欧美国产另类| 亚洲精品美女| 久久久久中文| 精品国产欧美| 色8久久久久| 99精品小视频| 美女精品视频在线| 亚洲精品动态| 欧美特黄一区| 日韩网站中文字幕| 国产精品密蕾丝视频下载| 欧美日韩黑人| 日韩在线中文| 成人在线黄色| 国产精品sss在线观看av| 天堂俺去俺来也www久久婷婷| 国产主播一区| 欧洲精品一区二区三区| 精品三级久久久| 国产精品亚洲欧美一级在线| 亚洲精品美女91| 男人操女人的视频在线观看欧美| 1000部精品久久久久久久久| 伊人网在线播放| 色爱综合网欧美| 牛牛精品成人免费视频| 日韩三级精品| 免费人成精品欧美精品| 欧美日韩国产精品一区二区亚洲| 999国产精品视频| 国产精品日韩欧美一区| 麻豆精品av| 亚洲一级二级| 日韩一区二区在线免费| 精品国产一级| 亚洲区欧美区| 极品日韩av| 91精品国产乱码久久久久久久| 欧美激情福利| 欧美国产另类| 国产伦一区二区三区| 亚洲一级淫片| 蜜桃视频免费观看一区| 国产精品毛片在线| 视频在线观看91| 欧美特黄一区| 亚洲永久字幕| 日韩精品一二三区| 综合激情婷婷| 亚洲精品视频一二三区| 蜜臀av国产精品久久久久| 亚洲免费观看高清完整版在线观| 在线视频亚洲欧美中文| 日韩欧美另类中文字幕| 欧美一级二区| 久久的色偷偷| 久久精品二区亚洲w码| 国产成人精品一区二区免费看京| 色婷婷色综合| 国产91一区| 亚洲一区二区三区四区五区午夜| 免费日本视频一区| 日韩av网站在线免费观看| 国产精品一区二区三区www| 亚洲免费专区| 日韩中文字幕区一区有砖一区 | 日韩在线视频精品| 成人va天堂| 免费不卡中文字幕在线| 在线一区免费观看| 中文字幕视频精品一区二区三区| 免费人成精品欧美精品| 亚洲日本久久| 欧美日韩国产一区二区在线观看| 国产精品视频一区二区三区| 国产精品成久久久久| 亚洲调教视频在线观看| 中文一区一区三区免费在线观| 国产欧美综合一区二区三区| 美女国产精品久久久| 日韩精品诱惑一区?区三区| 香蕉人人精品| 亚洲精品观看| 国产粉嫩在线观看| 日韩亚洲国产欧美| **爰片久久毛片| 首页国产精品| 亚洲一区国产一区| 国产精品白丝一区二区三区| 欧美国产偷国产精品三区| 99国产精品私拍| 国产精品**亚洲精品| 群体交乱之放荡娇妻一区二区| 亚洲一区不卡| 奇米亚洲欧美| 中文字幕色婷婷在线视频| 久久国产66| 精品丝袜久久| 久久婷婷激情| 日韩影片在线观看| 97精品国产福利一区二区三区| 国产女优一区| 国产成人免费精品| 久久都是精品| 国产h片在线观看| 亚洲精品福利| 秋霞影视一区二区三区| 日本不卡视频在线| 三上悠亚国产精品一区二区三区| 亚洲欧洲另类| 久久一区精品| 免费人成网站在线观看欧美高清| 国内精品亚洲| 最新国产精品| 成人羞羞在线观看网站| 欧美日一区二区三区在线观看国产免| 欧美日韩水蜜桃| 国产精品videossex久久发布| 午夜久久99| 成人一区而且| 欧美亚洲tv| 国产精品婷婷| 日韩一区二区在线免费| 日韩av电影一区| 欧美日韩一二三四|