基于Flyway實(shí)現(xiàn)簡(jiǎn)化Spring Boot項(xiàng)目部署
1.什么是 Flyway
我們?cè)诠咀鲩_(kāi)發(fā)時(shí),由于項(xiàng)目需求的變化,或者前期設(shè)計(jì)缺陷,導(dǎo)致在后期需要修改數(shù)據(jù)庫(kù),這應(yīng)該是一個(gè)比較常見(jiàn)的事情,如果項(xiàng)目還沒(méi)上線(xiàn),你可能把表刪除了重新創(chuàng)建,但是如果項(xiàng)目已經(jīng)上線(xiàn)了,就不能這樣簡(jiǎn)單粗暴了,我們需要通過(guò) SQL 腳本在已有數(shù)據(jù)表的基礎(chǔ)上進(jìn)行升級(jí)。
目前 Java 這塊,想要對(duì)數(shù)據(jù)庫(kù)的版本進(jìn)行管理主要有兩個(gè)工具:
Flyway
Liquibase
兩個(gè)工具各有千秋,但是核心功能都是數(shù)據(jù)庫(kù)的版本管理,這里主要來(lái)看 Flyway。就像我們使用 Git 來(lái)管理代碼版本一樣,F(xiàn)lyway 可以用來(lái)管理數(shù)據(jù)庫(kù)版本。
好了,接下來(lái)我們就來(lái)看看用 Flyway 如何簡(jiǎn)化微人事部署,然后再來(lái)說(shuō)說(shuō) Flyway 的一個(gè)大致原理。
2.嵌入到微人事
如果是在一個(gè)全新的項(xiàng)目中使用 Flyway,那么在新建一個(gè) Spring Boot 項(xiàng)目時(shí),就有 Flyway 的選項(xiàng),如下圖:
項(xiàng)目創(chuàng)建成功后,resources 目錄下也會(huì)多出來(lái)一個(gè) db/migration 目錄,這個(gè)目錄用來(lái)存放數(shù)據(jù)庫(kù)腳本,如下:
注意
這個(gè)如果創(chuàng)建項(xiàng)目時(shí)就選擇了 Flyway 依賴(lài),就會(huì)有這個(gè)目錄?,F(xiàn)在我要在已經(jīng)做好的微人事中加入 Flyway,這個(gè)目錄就需要我手動(dòng)創(chuàng)建了。
首先在微人事中添加 flyway 依賴(lài):
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency>
然后在 vhr-web 模塊下的 resources 目錄下,手動(dòng)創(chuàng)建 db/migration 目錄,然后在該目錄下創(chuàng)建數(shù)據(jù)庫(kù)腳本,數(shù)據(jù)庫(kù)腳本的命名方式如下:
V<VERSION>__<NAME>.sql
首先是大寫(xiě)字母 V,然后是版本號(hào),要是有小版本可以用下劃線(xiàn)隔開(kāi),例如 2_1,版本號(hào)后面是兩個(gè)下劃線(xiàn),然后是腳本名稱(chēng),文件后綴是 .sql。
例如我這里創(chuàng)建我的第一個(gè)數(shù)據(jù)庫(kù)腳本,取名為 V1__vhr.sql,腳本內(nèi)容就是微人事的數(shù)據(jù)庫(kù)腳本,大家可以在 https://github.com/lenve/vhr 這里獲取到。
完了之后,可以不用添加額外配置,大家只需要在本地 MySQL 中創(chuàng)建一個(gè)空的 vhr 數(shù)據(jù)庫(kù)即可,然后直接啟動(dòng)微人事項(xiàng)目,項(xiàng)目啟動(dòng)成功后,我們查看啟動(dòng)日志:
從這段啟動(dòng)日志中,我們可以看到 Flyway 的執(zhí)行信息,數(shù)據(jù)庫(kù)腳本的執(zhí)行執(zhí)行,同時(shí)這里還說(shuō)了,F(xiàn)lyway 還給創(chuàng)建了一個(gè) flyway_schema_history 表,這個(gè)表用來(lái)記錄數(shù)據(jù)庫(kù)的更新歷史。
這個(gè)時(shí)候,打開(kāi)本地?cái)?shù)據(jù)庫(kù),我們發(fā)現(xiàn) vhr 庫(kù)中該有的表都有了。同時(shí)還發(fā)現(xiàn)了 flyway_schema_history 表,如下:
有了這條記錄,下次再啟動(dòng) vhr 項(xiàng)目,V1__vhr.sql 這個(gè)腳本文件就不會(huì)執(zhí)行了,因?yàn)橄到y(tǒng)知道這個(gè)腳本已經(jīng)執(zhí)行過(guò)了,如果你還想讓 V1__vhr.sql 腳本再執(zhí)行一遍,需要手動(dòng)刪除 flyway_schema_history 表中的對(duì)應(yīng)記錄,那么項(xiàng)目啟動(dòng)時(shí),這個(gè)腳本就會(huì)被執(zhí)行了。
3.執(zhí)行細(xì)節(jié)
- 我們?cè)诙x腳本的時(shí)候,除了 V 字開(kāi)頭的腳本之外,還有一種 R 字開(kāi)頭的腳本,V 字開(kāi)頭的腳本只會(huì)執(zhí)行一次,而 R 字開(kāi)頭的腳本,只要腳本內(nèi)容發(fā)生了變化,啟動(dòng)時(shí)候就會(huì)執(zhí)行。
- 使用了 Flyway 之后,如果再想進(jìn)行數(shù)據(jù)庫(kù)版本升級(jí),就不用該以前的數(shù)據(jù)庫(kù)腳本了,直接創(chuàng)建新的數(shù)據(jù)庫(kù)腳本,項(xiàng)目在啟動(dòng)時(shí)檢測(cè)了有新的更高版本的腳本,就會(huì)自動(dòng)執(zhí)行,這樣,在和其他同事配合工作時(shí),也會(huì)方便很多。因?yàn)檎N覀兌际菑?Git 上拉代碼下來(lái),不拉數(shù)據(jù)庫(kù)腳本,這樣要是有人更新了數(shù)據(jù)庫(kù),其他同事不一定能夠收到最新的通知,使用了 Flyway 就可以有效避免這個(gè)問(wèn)題了。
- 所有的腳本,一旦執(zhí)行了,就會(huì)在 flyway_schema_history 表中有記錄,如果你不小心搞錯(cuò)了,可以手動(dòng)從 flyway_schema_history 表中刪除記錄,然后修改 SQL 腳本后再重新啟動(dòng)(生產(chǎn)環(huán)境不建議)。
4.其他配置
在 Spring Boot 中,關(guān)于 Flyway 也有不少配置,這些配置都在 application.properties 中進(jìn)行配置,常用的幾個(gè)來(lái)和大家說(shuō)下:
- spring.flyway.enabled:是否開(kāi)啟 flyway,默認(rèn)就是開(kāi)啟的
- spring.flyway.encoding:flyway 字符編碼
- spring.flyway.locations:sql 腳本的目錄,默認(rèn)是 classpath:db/migration,如果有多個(gè),用 , 隔開(kāi)
- spring.flyway.clean-disabled:這個(gè)屬性非常關(guān)鍵,它表示是否要清除已有庫(kù)下的表,如果執(zhí)行的腳本是 V1__xxx.sql,那么會(huì)先清除已有庫(kù)下的表,然后再執(zhí)行腳本,這在開(kāi)發(fā)環(huán)境下還挺方便,但是在生產(chǎn)環(huán)境下就要命了,而且它默認(rèn)就是要清除,生產(chǎn)環(huán)境一定要自己配置設(shè)置為 true。
- spring.flyway.table:配置數(shù)據(jù)庫(kù)信息表的名稱(chēng),默認(rèn)是 flyway_schema_history。
好了,關(guān)于 Flyway 我就先說(shuō)這么多,代碼也已經(jīng)更新到 vhr (https://github.com/lenve/vhr)上了,感興趣的小伙伴不妨下載試一下。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Flyway詳解及Springboot集成Flyway的詳細(xì)教程
- SpringBoot項(xiàng)目集成Flyway進(jìn)行數(shù)據(jù)庫(kù)版本控制的詳細(xì)教程
- Spring Boot項(xiàng)目使用Flyway的詳細(xì)教程
- SpringBoot整合Flyway的方法(數(shù)據(jù)庫(kù)版本遷移工具)
- 淺談SpringBoot之開(kāi)啟數(shù)據(jù)庫(kù)遷移的FlyWay使用
- 詳解Spring Boot中使用Flyway來(lái)管理數(shù)據(jù)庫(kù)版本
- SpringBoot整合flyway實(shí)現(xiàn)步驟解析
相關(guān)文章
Spring中AOP的切點(diǎn)、通知、切點(diǎn)表達(dá)式及知識(shí)要點(diǎn)整理
這篇文章主要介紹了Spring中AOP的切點(diǎn)、通知、切點(diǎn)表達(dá)式及知識(shí)要點(diǎn)整理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03詳解Java的MyBatis框架中SQL語(yǔ)句映射部分的編寫(xiě)
這篇文章主要介紹了Java的MyBatis框架中SQL語(yǔ)句映射部分的編寫(xiě),文中分為resultMap和增刪查改實(shí)現(xiàn)兩個(gè)部分來(lái)講解,需要的朋友可以參考下2016-04-04Jenkins系統(tǒng)如何進(jìn)行數(shù)據(jù)備份
隨著我們的長(zhǎng)期使用,Jenkins系統(tǒng)中的內(nèi)容會(huì)越來(lái)越多,特別是一些配置相關(guān)的東西,不能有任何丟失。這個(gè)時(shí)候我們就需要定期備份我們的Jenkins系統(tǒng),避免一些誤操作不小心刪除了某些重要文件,本文就將介紹下Jenkins系統(tǒng)如何進(jìn)行數(shù)據(jù)備份2021-06-06JAVA學(xué)習(xí)筆記:注釋、變量的聲明和定義操作實(shí)例分析
這篇文章主要介紹了JAVA學(xué)習(xí)筆記:注釋、變量的聲明和定義操作,結(jié)合實(shí)例形式分析了Java注釋、變量的聲明和定義相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04SpringCloud Config統(tǒng)一配置中心問(wèn)題分析解決與客戶(hù)端動(dòng)態(tài)刷新實(shí)現(xiàn)
springcloud config是一個(gè)解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個(gè)部分,server端提供配置文件的存儲(chǔ)、以接口的形式將配置文件的內(nèi)容提供出去,client端通過(guò)接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用2022-10-10SpringBoot中的PUT和Delete請(qǐng)求使用
這篇文章主要介紹了SpringBoot中的PUT和Delete請(qǐng)求使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07