1. 程式人生 > >在SpringBoot中使用flyway進行資料庫版本管理

在SpringBoot中使用flyway進行資料庫版本管理

本文大綱

  • flyway是什麼
  • 能幫助我們解決什麼問題
  • springboot環境下使用flyway
  • flyway的工作原理

一、flyway是什麼

Flyway是一個開源的資料庫版本管理工具,並且極力主張“約定大於配置”,簡單、專注、強大。可以使用SQL完成資料同步,或者基於特定資料庫的語法(例如PL / SQL,T-SQL等)或Java程式碼(適用於高階資料轉換或處理LOB)的方式編寫。並且資料庫支援非常廣泛:

二、能幫助我們解決什麼問題

那麼,我們首先解釋一下什麼是資料庫版本管理?

  • 大家都知道git是幫助軟體專案進行程式碼版本的管理,方便程式設計師協同開發
  • 那麼FlyWay就是資料庫版本管理的工具,目標是保證多環境下資料庫的狀態一致性,方便程式設計師協同開發

舉個簡單的例子:

  • 開發人員通常使用同一個資料庫或者自建庫進行開發工作,這個資料庫通常叫做開發庫。
  • 測試人員為了保障測試資料的有效性,通常自建一個庫進行測試,這個資料庫叫做測試庫。
  • 銷售人員為了保證演示資料的效果,通常也需要一個單獨的資料庫,這個資料庫叫做演示庫。
  • 正式生產上線的庫,供給使用者使用,這個資料庫叫做生產庫。

那麼問題就來了:我們如何保證資料庫schema的狀態一致?某一個開發人員修改了開發庫,新增了一個欄位,如何能夠有效的同步到測試庫,測試通過之後如何有效的同步到演示庫和生產庫?在沒有Flyway之前,這個動作通常是由上執行緒序員自己去執行SQL來完成的,或者比較正規的公司專門有版本管理人員去操作。這種方式通常存在幾個問題:

  • 開發團隊內部的溝通成本增加,比如某一個成員修改了一個數據庫欄位,其他人可能都不知道。
  • 開發團隊和測試團隊和其他團隊之間的溝通成本增加
  • 無法完成自動化的持續整合,持續整合的過程程式碼可以通過git、maven、docker、k8s等工具來實現自動化的程式碼打包、部署。但是資料庫的狀態變化沒有得到有效的自動變更,持續整合的過程的自動化就無法實現。

這也就是我們學習Flyway的目的:Flyway能夠自動的幫助我們有效的同步各個釋出資料庫之間的狀態,不管你是加了或者刪了一個欄位,還是新加了一張表,他都能自動化的跟隨專案的釋出同時釋出。

三、 springboot環境下使用flyway

首先,我們為SpringBoot專案新增Flyway依賴


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

然後我們要保證資料庫裡面有spring.datasource的資料來源配置。並且在application.properties中新增如下的配置


spring:
  flyway:
    enabled: true    #啟用flyway
    encoding: utf-8   #字元編碼
    locations: ["classpath:db/migration"]  #版本控制檔案存放目錄

然後在resources/db/migration目錄下面,加入如下格式的指令碼:


V1.1__create_table.sql
V1.2__update_person_table.sql
V1.3__create_new_table.sql
V1.4__add_person_comment.sql
V2.1__modify_person_data.sql

大寫V後面緊跟資料庫指令碼的版本號(遞增形式、不能重複),然後兩個下劃線,之後是對指令碼內容進行描述。如:V1.1__create_table.sql是用於建立表結構的資料庫指令碼,內容是create table之類的DDL。 第二個指令碼是對資料庫中person表進行了更新。總之腳本里面的內容,就是你希望對spring.datasource代表的資料庫進行的操作,可以是表的建立、刪除、修改,也可以是對資料的建立刪除修改。

當然,我個人不建議將DML-SQL寫入指令碼,也就是不要在這個腳本里面寫insert、update、delete。以免不注意的情況下,造成生產資料的誤操作。如果你們公司在生產上線管理方面沒有嚴格的稽核程式,在生產環境下,就乾脆不要使用flyway,方便開發是一方面,生產安全更為重要!

最後,啟動SpringBoot專案,在該目標庫範圍內沒有執行過的SQL指令碼被執行。並將指令碼執行資訊儲存在資料庫的schema_version_history資料表裡面。

四、FlyWay的工作原理

  • 首先專案啟動flyway會去db/migration下面掃描檔案,獲取檔名,並解析版本號
  • 然後去schema_version_history表裡面找對應的版本執行資訊,如果你的檔案版本號大於資料庫記錄版本,就執行指令碼。否則就忽略。

    期待您的關注

  • 博主最近新寫了一本書:《手摸手教您學習SpringBoot系列-16章97節》
  • 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格。