日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

flyway配置mysql_Flyway快速上手教程

發布時間:2024/9/27 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flyway配置mysql_Flyway快速上手教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Flyway是什么

官網解釋地非常全面,可先大致閱讀一下。

簡單地說,flyway是一個能對數據庫變更做版本控制的工具。

二、為什么要用Flyway

在多人開發的項目中,我們都習慣了使用SVN或者Git來對代碼做版本控制,主要的目的就是為了解決多人開發代碼沖突和版本回退的問題。

其實,數據庫的變更也需要版本控制,在日常開發中,我們經常會遇到下面的問題:

自己寫的SQL忘了在所有環境執行;

別人寫的SQL我們不能確定是否都在所有環境執行過了;

有人修改了已經執行過的SQL,期望再次執行;

需要新增環境做數據遷移;

每次發版需要手動控制先發DB版本,再發布應用版本;

其它場景...

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

三、如何使用Flyway

3.1 準備數據庫

首先,我們需要準備好一個空的數據庫。(數據庫的安裝和賬密配置此處忽略)

此處以mysql為例,在本地電腦上新建一個空的數據庫,名稱叫做flyway,我們通過dbeaver看到的樣子如下:

新建一個空的數據庫

3.2 準備SpringBoot工程

在start.spring.io上新建一個SpringBoot工程,要求能連上自己本地新建的mysql數據庫flyway,這個步驟也比較簡單,就不再細講。

但要注意的是,application.properties中數據庫的配置務必配置正確,下述步驟中系統啟動時,flyway需要憑借這些配置連接到數據庫。這里貼一份:

# db config

spring.datasource.url=jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT

spring.datasource.username=root

spring.datasource.password=root

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3.3flyway的引入與嘗試

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

org.flywaydb

flyway-core

5.2.4

其次,在src/main/resources目錄下面新建db.migration文件夾,默認情況下,該目錄下的.sql文件就算是需要被flyway做版本控制的數據庫SQL語句。

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

僅需要被執行一次的SQL命名以大寫的"V"開頭,后面跟上"0~9"數字的組合,數字之間可以用“.”或者下劃線"_"分割開,然后再以兩個下劃線分割,其后跟文件名稱,最后以.sql結尾。比如,V2.1.5__create_user_ddl.sql、V4.1_2__add_user_dml.sql。

可重復運行的SQL,則以大寫的“R”開頭,后面再以兩個下劃線分割,其后跟文件名稱,最后以.sql結尾。。比如,R__truncate_user_dml.sql。

其中,V開頭的SQL執行優先級要比R開頭的SQL優先級高。

如下,我們準備了三個腳本,分別為:

V1__create_user.sql,其中代碼如下,目的是建立一張user表,且只執行一次。

CREATE TABLE IF NOT EXISTS `USER`(

`USER_ID` INT(11) NOT NULL AUTO_INCREMENT,

`USER_NAME` VARCHAR(100) NOT NULL COMMENT '用戶姓名',

`AGE` INT(3) NOT NULL COMMENT '年齡',

`CREATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,

`CREATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',

`UPDATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,

`UPDATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',

PRIMARY KEY (`USER_ID`)

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

V2__add_user.sql,其中代碼如下,目的是往user表中插入一條數據,且只執行一次。

insert into `user`(user_name,age) values('lisi',33);

R__add_unknown_user.sql,其中代碼如下,目的是每次啟動倘若有變化,則往user表中插入一條數據。

insert into `user`(user_name,age) values('unknown',33);

與之相對應的目錄截圖如下:

項目目錄結構

其中2.1.6、2.1.7和every的文件夾不會影響flyway對SQL的識別和運行,可以自行取名和分類。

到這一步,flyway的默認配置已經足夠我們開始運行了。此時,我們啟動SpringBoot的主程序,如果以上步驟沒有配置錯誤的話,運行截圖如下:

flyway成功運行

此時,我們刷新數據庫,可以看到flyway的歷史記錄表已經生成并插入了三個版本的記錄:

flyway_schema_history

而且,user表也已經創建好了并插入了兩條數據:

user

我們不改變任何東西,再次執行主程序,日志如下:

再次執行flyway

兩張數據庫表中的內容也毫無任何變化。

可是,如果我們修改V2__add_user.sql中的內容,再次執行的話,就會報錯,提示信息如下:

[ERROR] Migration checksum mismatch for migration version 2

如果我們修改了R__add_unknown_user.sql,再次執行的話,該腳本就會再次得到執行,并且flyway的歷史記錄表中也會增加本次執行的記錄。

3.4 maven插件的使用

以上步驟中,每次想要migration都需要運行整個springboot項目,并且只能執行migrate一種命令,其實flyway還是有很多其它命令的。maven插件給了我們不需要啟動項目就能執行flyway各種命令的機會。

在pom中引入flyway的插件,同時配置好對應的數據庫連接。

org.flywaydb

flyway-maven-plugin

5.2.4

jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT

root

root

com.mysql.cj.jdbc.Driver

然后更新maven插件列表,就可以看到flyway的全部命令了。

flyway的各種命令

此時,我們雙擊執行上圖中的flyway:migrate的效果和啟動整個工程執行migrate的效果是一樣的。

其它命令的作用如下列出,各位可自行實驗體會:

baseline

對已經存在數據庫Schema結構的數據庫一種解決方案。實現在非空數據庫新建MetaData表,并把Migrations應用到該數據庫;也可以在已有表結構的數據庫中實現添加Metadata表。

clean

清除掉對應數據庫Schema中所有的對象,包括表結構,視圖,存儲過程等,clean操作在dev 和 test階段很好用,但在生產環境務必禁用。

info

用于打印所有的Migrations的詳細和狀態信息,也是通過MetaData和Migrations完成的,可以快速定位當前的數據庫版本。

repair

repair操作能夠修復metaData表,該操作在metadata出現錯誤時很有用。

undo

撤銷操作,社區版不支持。

validate

驗證已經apply的Migrations是否有變更,默認開啟的,原理是對比MetaData表與本地Migrations的checkNum值,如果值相同則驗證通過,否則失敗。

3.5 flyway補充知識

flyway執行migrate必須在空白的數據庫上進行,否則報錯;

對于已經有數據的數據庫,必須先baseline,然后才能migrate;

clean操作是刪除數據庫的所有內容,包括baseline之前的內容;

盡量不要修改已經執行過的SQL,即便是R開頭的可反復執行的SQL,它們會不利于數據遷移;

四、總結

在進行了如上的實驗后,相信我們都已經掌握了flyway的初步使用,當需要做數據遷移的時候,更換一個新的空白數據庫,執行下migrate命令,所有的數據庫更改都可以一步到位地遷移過去,真的是太方便了。

附錄

flyway的配置清單:

flyway.baseline-description對執行遷移時基準版本的描述.

flyway.baseline-on-migrate當遷移時發現目標schema非空,而且帶有沒有元數據的表時,是否自動執行基準遷移,默認false.

flyway.baseline-version開始執行基準遷移時對現有的schema的版本打標簽,默認值為1.

flyway.check-location檢查遷移腳本的位置是否存在,默認false.

flyway.clean-on-validation-error當發現校驗錯誤時是否自動調用clean,默認false.

flyway.enabled是否開啟flywary,默認true.

flyway.encoding設置遷移時的編碼,默認UTF-8.

flyway.ignore-failed-future-migration當讀取元數據表時是否忽略錯誤的遷移,默認false.

flyway.init-sqls當初始化好連接時要執行的SQL.

flyway.locations遷移腳本的位置,默認db/migration.

flyway.out-of-order是否允許無序的遷移,默認false.

flyway.password目標數據庫的密碼.

flyway.placeholder-prefix設置每個placeholder的前綴,默認${.

flyway.placeholder-replacementplaceholders是否要被替換,默認true.

flyway.placeholder-suffix設置每個placeholder的后綴,默認}.

flyway.placeholders.[placeholder name]設置placeholder的value

flyway.schemas設定需要flywary遷移的schema,大小寫敏感,默認為連接默認的schema.

flyway.sql-migration-prefix遷移文件的前綴,默認為V.

flyway.sql-migration-separator遷移腳本的文件名分隔符,默認__

flyway.sql-migration-suffix遷移腳本的后綴,默認為.sql

flyway.tableflyway使用的元數據表名,默認為schema_version

flyway.target遷移時使用的目標版本,默認為latest version

flyway.url遷移時使用的JDBC URL,如果沒有指定的話,將使用配置的主數據源

flyway.user遷移數據庫的用戶名

flyway.validate-on-migrate遷移時是否校驗,默認為true

總結

以上是生活随笔為你收集整理的flyway配置mysql_Flyway快速上手教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。