<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Boot 集成 Flyway,數(shù)據(jù)庫也能做版本控制,太牛逼了!

          共 4991字,需瀏覽 10分鐘

           ·

          2021-07-04 10:49

          點擊關注公眾號,Java干貨及時送達

          一、Flyway 是什么?

          我們都知道,Git/ SVN 是代碼界的版本控制工具,那么,Flyway 就是一款數(shù)據(jù)庫界的版本控制工具,它可以記錄數(shù)據(jù)庫的變化記錄。

          可能很多公司都是通過人工去維護、同步數(shù)據(jù)庫腳本,但經(jīng)常會遇到疏忽而遺漏的情況,舉個簡單的例子:

          我們在開發(fā)環(huán)境對某個表新增了一個字段,而提交測試時卻忘了提交該 SQL 腳本,導致出現(xiàn) bug 而測試中斷,從而影響開發(fā)、測試的工作效率。

          有了 Flyway,我們可以按版本約定,統(tǒng)一管理所有的 SQL 腳本變更,在所有環(huán)境自動同步數(shù)據(jù)庫,而無需人為手工控制,再也不用擔心因數(shù)據(jù)庫不同步而導致的各種環(huán)境問題。

          官網(wǎng):https://flywaydb.org/

          支持的數(shù)據(jù)庫:

          支持的運行方式:

          支持的 7 個命令:

          • Migrate(遷移)
          • Clean(清理所有配置的對象)
          • Info(顯示遷移狀態(tài)和細節(jié))
          • Validate(驗證遷移規(guī)則)
          • Undo(撤消最近的遷移)
          • Baseline(建立基線)
          • Repair(修復遷移歷史表)

          二、Spring Boot 集成 Flyway

          Flyway 有社區(qū)開源免費版本和商業(yè)版本,本文以開源社區(qū)免費版,以及 Java API 的運行方式為示例進行演示下 Flyway Migrate 功能。

          1、引入依賴

          Flyway 幾乎是零依賴,最低的要求是:

          • JDK 1.7+

          • Jdbc Driver

          Spring Boot 基礎教程就不介紹了,棧長之前寫過很多,不會的關注公眾號:Java技術棧,在后臺回復:boot,歷史 Spring Boot 實戰(zhàn)教程我都整理好了。

          本文演示環(huán)境:

          這里僅展示 Spring Boot 之外的核心依賴:

          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-data-jdbc</artifactId>
              </dependency>
              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
                  <version>8.0.21</version>
              </dependency>
              <dependency>
                  <groupId>org.flywaydb</groupId>
                  <artifactId>flyway-core</artifactId>
                  <version>7.10.0</version>
              </dependency>
          </dependencies>

          2、添加配置

          Spring Boot 默認提供了對 Flyway 的自動配置:

          org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration

          所以,Spring Boot 項目,我們僅僅只要提供對應的配置參數(shù)即可:

          spring:
            datasource:
              driver-class-name: com.mysql.cj.jdbc.Driver
              url: jdbc:mysql://localhost:3306/flyway
              username: flyway
              password: 12345678
            flyway:
              locations:
                - classpath:flyway
              table: t_flyway_history

          版本注意:

          Spring Boot 2.5 及以上版本,如果使用了 spring.flyway.url 進行定義,同時需要加上 username/ password 進行認證。

          如果是第一次使用 Flyway,需要在 resources 目錄下創(chuàng)建配置文件中指定的 Flyway 遷移目錄:resources/flyway。

          Flyway 也是約定大于配置的思想,以上 Flyway 的相關配置都可以不用寫,可以說是零配置,它們都有默認值:

          • spring.flyway.locations: classpath:db/migration,用于掃描的遷移腳本目錄
          • spring.flyway.table: flyway_schema_history,用于記錄所有的版本變化記錄

          更多 Flyway 的參數(shù)配置可以參考這個類:

          org.springframework.boot.autoconfigure.flyway.FlywayProperties

          另外,最好是創(chuàng)建一套 Flyway 專門的數(shù)據(jù)庫表和用戶,和業(yè)務表、用戶分開,權利最小化。

          三、遷移實戰(zhàn)

          1、創(chuàng)建遷移腳本

          然后在該目錄下創(chuàng)建遷移腳本,遷移腳本文件命名規(guī)則是:

          V__.sql

          注意:版本號后面是兩個下劃線。

          如棧長我第一次創(chuàng)建三個遷移腳本:

          • V1.0.0__create_javastack.sql
          • V1.0.1__insert_javastack.sql
          • V1.0.2__update_javastack.sql

          首先創(chuàng)建一個表,然后插入幾條記錄,再更新記錄,具體的 SQL 腳本內(nèi)容就不貼上來了,完整的示例代碼已提交 Github:

          https://github.com/javastacks/spring-boot-best-practice

          OK,Spring Boot 集成 Flyway 及相關的腳本都弄完了,可以說是不能再簡單了,我們啟動系統(tǒng)驗證下腳本有沒有執(zhí)行。

          1)首次啟動

          從啟動日志可以看出,已經(jīng)遷移了 3 個腳本,并且將當前版本更新到了 v1.0.2:

          查看數(shù)據(jù)庫,F(xiàn)lyway 歷史表和業(yè)務表也都已經(jīng)創(chuàng)建:

          可以看出歷史表記錄了 3 個腳本的遷移詳細記錄,業(yè)務表的數(shù)據(jù)也已經(jīng)插入并得到更新:

          2)不修改再次啟動

          在不修改任何代碼的情況下再次啟動:

          成功驗證了 3 個遷移腳本,打印了當前的版本號,但并沒有進行遷移,為什么?

          因為這三個腳本都執(zhí)行過遷移了,主要是版本號都小于等于當前版本號:1.0.2,所以不會進行遷移。

          3)修改再次啟動

          我們再新增兩個 SQL 腳本:

          • V1.0.3__alter_javastack.sql
          • V1.0.4__update_javastack.sql

          首先新增兩個字段:note 和 time,然后再進行對應的數(shù)據(jù)更新。

          我們再次啟動下:

          成功遷移,當前版本來到了 v1.0.4。

          查看數(shù)據(jù)庫:

          note 和 time 字段已經(jīng)創(chuàng)建,并得到更新。

          2、創(chuàng)建重復遷移腳本

          從上面的例子我們知道,只要目錄下的 SQL 腳本版本號大于當前版本號才會執(zhí)行遷移,并且腳本都是一次性執(zhí)行遷移的,如何做到可重復遷移呢?

          Flyway 支持可重復遷移腳本,可重復遷移腳本文件命名規(guī)則是:

          R__.sql

          R(Repeated),即:可重復的。

          這里我創(chuàng)建一個更新 note 和 time 字段的遷移腳本:

          • R__update_javastack.sql
          1)首次啟動

          我們再次啟動下:

          從以上截圖可以看到,重復遷移腳本也已經(jīng)成功執(zhí)行了。

          2)不修改再次啟動

          如何確定能否重復執(zhí)行遷移呢?

          我們不修改任何代碼再次啟動下:

          顯示沒有遷移的必要!!

          那是因為我們沒有對重復遷移腳本做任何的修改,所以系統(tǒng)不會遷移!

          3)修改再次啟動

          我們再次改下腳本,把 note 后面加一個 ok,再次啟動下:

          腳本經(jīng)過修改后再次遷移成功了,說明可重復遷移腳本也需要經(jīng)過改動才能再次進行遷移,F(xiàn)lyway 會進行腳本對比。

          最后貼一下遷移腳本目錄:

          這里我放到一個目錄進行演示,實際開發(fā)中可以放到多個目錄中區(qū)分維護。

          四、遷移流程

          OK,我們來梳理下遷移流程:

          1)Flyway 會掃描配置的腳本目錄下的腳本文件;

          2)如果歷史記錄表不存在,則新建歷史記錄表;

          3)如果是一次性執(zhí)行腳本(V),按版本號從小到大執(zhí)行遷移腳本,與當前歷史表中的版本號做對比,大于當前版本號的腳本才會被執(zhí)行遷移;

          4)如果是可重復執(zhí)行腳本(R),檢查腳本是否有變動,有變動的可重復腳本才會被執(zhí)行遷移;

          Flyway Migrate 遷移流程圖:

          來源官網(wǎng)

          另外,我們也可以手動刪除遷移歷史表中的遷移記錄,這樣也可以達到讓一次性腳本再次執(zhí)行的目的,但不建議在生產(chǎn)環(huán)境上進行使用。

          五、總結

          使用 Flyway 可以很方便的處理數(shù)據(jù)庫表結果、數(shù)據(jù)的版本遷移,使用簡單、自動化,大大提高生產(chǎn)力,再也不需要手工在控制臺進行,那樣更容易出錯或者遺漏,畢竟人都是會經(jīng)常犯錯的。

          本文使用的是 Java API 的方式,在項目啟動時進行遷移,另外還有其他 3 種方式,文前有介紹,大家根據(jù)實際需要進行應用。

          本文只是拋磚引玉,只介紹了 Flyway 中的 Migrate(遷移)環(huán)節(jié),也是 Flyway 最主要的環(huán)節(jié),另外還有其他 6 個環(huán)節(jié),后續(xù)棧長在時間再進行分享,請陸續(xù)關注公眾號Java技術棧,公眾號第一時間推送。

          本文完整示例代碼已上傳 Github:

          https://github.com/javastacks/spring-boot-best-practice

          更多細節(jié)可以參考官方文檔:

          https://flywaydb.org/documentation/

          最后,你們有使用 Flyway 或者相關工具嗎?歡迎分享使用經(jīng)驗~

          覺得我的文章對你用收獲的話,動動小手,給個在看、轉(zhuǎn)發(fā),原創(chuàng)不易,棧長需要你的鼓勵。

          版權申明:本文系公眾號 "Java技術棧" 原創(chuàng),原創(chuàng)實屬不易,轉(zhuǎn)載、引用本文內(nèi)容請注明出處,禁止抄襲、洗稿,請自重,尊重大家的勞動成果和知識產(chǎn)權,抄襲必究。






          關注Java技術棧看更多干貨



          獲取 Spring Boot 實戰(zhàn)筆記!
          瀏覽 36
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码精品一区二区三区四区找到 | 国产第页 | 大香蕉欧美在线 | 先锋影音麻豆资源 | 四虎91|