SpringBoot項目中使用flyway進行MySQL數據庫版本控制

什麼是flyway

Flyway is an open-source database migration tool. It strongly favors simplicity and convention over configuration.php

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

官方網站:flywaydb.org/git

關於flyway的更多介紹信息請移步google一下。spring

爲何要使用flyway

在平常的開發中,咱們使用git管理代碼的版本,那麼數據庫的版本呢?使用flyway。sql

我的認爲,能夠大概的將flyway理解爲數據庫的git,方便多人協做及記錄。數據庫

git:讓你和同事更加輕鬆的維護同一個項目,你能夠很方便的獲取到他最新提交的改動。springboot

flyway:讓你及時的知道同事對數據庫的改動而且可以自動在你的本地執行這些改動。bash

我遇到的問題

我所經歷的項目大部分是已經配置好flyway的,也習慣了這一便利。服務器

最近新上手一個項目,和另外一個同事一塊兒維護,此項目沒有配置flyway,所以經歷瞭如下兩種狀況:app

1.同事對數據庫作了改動而且代碼合併到線上(我並不參與review),以後我拉取線上代碼,鏈接本地數據庫啓動項目,報錯,緣由是本地沒有新添加的數據表,而項目啓動依賴於他。

2.我在完成一個需求以後,打算將代碼上線,須要在代碼合入以前手動去線上(去服務器上或者經過phpmyadmin等工具)執行sql建立數據表。

這是什麼反人類操做???不怕我將create寫錯成drop嗎?

所以我忍無可忍,昨晚下班後加班了半個小時,給該項目添加了flyway的依賴。

springboot 集成 flyway

1.項目添加依賴

Maven

<dependency>
	<groupId>org.flywaydb</groupId>
	<artifactId>flyway-core</artifactId>
	<version>5.0.3</version>
</dependency>
複製代碼

Bazel:

//在deps中添加
"//third_party/java:org_flywaydb_flyway_core",
複製代碼

2.在application.properties文件中加入如下內容:

#flyway
#打開flyway
flyway.enabled=true
flyway.encoding=utf-8
#sql文件存放位置
flyway.locations=classpath:db/migration
#版本記錄表格
flyway.table=schemas_version
flyway.baseline-on-migrate=true
flyway.validate-on-migrate=false
複製代碼

其中重要的三項配置已經添加註釋,其餘的配置能夠百度自行修改。

3.上文配置的路徑classpath:db/migration下添加sql文件, 命名格式爲:

其中V以後的數字表明瞭當前版本,通常採用遞增的形式,不能夠重複。

可是能夠選擇多種形式,好比V1,V2或者V1.1,V1.2等等。

4.在數據庫中新建該數據庫,注意是全新的庫,啓動項目,項目在啓動時flyway會自動執行全部的sql文件,並新建一張數據表schemas_version來保存版本數據。

flyway好用嗎?

我以爲很好用,他成功解決了個人如下痛點。

  1. 和同事同時維護一個項目,同時對數據庫作出了一些修改,我在使用git拉取了最新的代碼以後,運行老是報錯,須要本身去從新執行一遍該表的建立語句來在本地進行建立,使用flyway後,拉取最新代碼的同時會拉取最新的sql文件,同時在服務啓動時自動建立數據表,對一些和本身無關的數據表徹底不用關心了。

  2. 新接手一個項目,在本地進行開發調試,本地新建數據庫後,須要執行一遍建表語句,使用flyway能夠自動的建立該項目的全部表格。

  3. 換電腦,我平常開發使用一臺臺式機及一臺筆記本,緊急狀況使用家中筆記本進行一些開發,在每次新換電腦時都須要從新建立一遍數據庫的表,十分的麻煩。使用flyway的遍歷同第二點(能夠理解爲換電腦等於在新電腦上運行新項目)。

注意事項

  1. 上面的教程並無很詳細的介紹flyway的具體各項配置,平常使用copy上面的配置改動有註釋的三項便可,有其餘須要能夠自行百度。

  2. 上述教程是在新項目中使用flyway,那麼可不能夠爲已有的項目添加flyway依賴呢?固然能夠。

爲已有項目添加依賴方法(此方法爲我的使用,應該有其餘更方即可靠的辦法,歡迎討論):

flyway是依靠什麼判斷版本呢?使用過一次以後你就知道,是根據數據庫中schemas_version表的記錄。

你每次執行過一次sql文件,在該表中就會添加一條相似於

V13 success
複製代碼

的數據。

當項目啓動時,flyway掃描sql文件,發現當前有V14開頭的文件,同時數據庫中沒有V14執行的記錄,那麼就會執行該文件。

你能夠將當前數據庫的全部表格建立語句導出到sql文件,而後新建V1__init_database.sql文件,將全部建立語句copy到該文件中,而後建立新庫,鏈接新庫啓動項目,以後copy新庫中schemas_version數據表的結構及數據,添加到已有的數據庫中,這樣項目啓動時便不會對已有的數據庫產生影響。

這波操做的本質是:模仿一條記錄,讓flyway認爲當前的數據庫是一個已經執行過的版本,不作任何的改動,後續的改動繼續添加便可。

  1. 有時會寫入錯誤的sql語句,修改後再次執行便會報錯顯示數據庫中已有該版本的記錄,此時進入數據庫刪除schemas_version中對應記錄從新執行便可。(反正在開發環境無所謂的,咱們又不會去生產環境執行錯誤的sql)。

總結:flyway是個好東西,強烈建議spring boot項目都進行配置,能夠節省許多時間及避免不少因聯合開發帶來的麻煩問題。

完。





ChangeLog

2018-10-10 完成

以上皆爲我的所思所得,若有錯誤歡迎評論區指正。

歡迎轉載,煩請署名並保留原文連接。

聯繫郵箱:huyanshi2580@gmail.com

更多學習筆記見我的博客------>呼延十

相關文章
相關標籤/搜索