Flyway使用說明

Flyway簡介

Flyway是源自Google的數據庫版本控制插件。項目開發中,數據庫每每須要隨着軟件版本進行變化,相比起手動執行SQL腳本,flyway能夠實現自動化的數據庫版本修改,讓開發/測試等環境的部署更加Easy。例如:spring

模塊A從版本1.0.0升級到1.2.0,須要在student表中添加2個字段並賦予默認值。sql

  • 傳統方式:升級模塊A時,須要運維大佬同時執行ddl腳本修改表字段+dml腳本賦予默認值,不然程序會報錯。若是環境比較多,那麼部署實際上是一個比較麻煩的事。
  • Flyway:把對數據庫作修改的sql放入到flyway的目錄,模塊A升級後,啓動時會自動執行sql腳本,運維無需關心數據庫的改動。

Flyway使用簡介

Flyway基本原理

Flyway的核心就是db.migrate這個文件夾和flyway_schema_history表。db.migrate下每一個sql文件對應flyway_schema_history的一條記錄。
以下圖:

Flyway會在數據庫中維護一張flyway_schema_history表。以下圖:

表中字段說明:數據庫

  • installed_rank 腳本執行編號,自動累加
  • version 數據庫版本號,由用戶定義(後續會解釋)
  • description 版本修改說明,用戶編寫
  • type 腳本類型,通常都是SQL
  • script 腳本文件名
  • checksum 這是對腳本文件進行CRC32運算獲得的數值,用以確保已經執行過的sql腳本不會再發生變化
  • installed_by 腳本運行的DB用戶
  • installed_on 腳本運行時間
  • execution_time 腳本執行耗時(ms)
  • success 腳本是否執行成功

當引入了flyway的項目啓動時,運行flyway.migrate()方法(Spring Boot引入會自動執行),Flyway會將db.migrate文件夾中的sql腳本和數據庫flyway_schema_history表作對比,當檢測到db.migrate中存在版本號大於flyway_schema_history最新版本的SQL腳本時,就會執行腳本,並更新flyway_schema_history表。運維

Flyway默認約定

Flyway遵循約定大於配置的原則,有一些默認的約定,按照約定建立腳本,flyway就能夠自動識別並執行。spring-boot

屬性 約定 說明
版本控制表 flyway_schema_history 數據庫中版本控制的表名,默認就是flyway_schema_history,可配置
腳本路徑 db/migrate 默認SQL腳本的存放路徑,是相對於classPath的相對路徑
腳本文件命名規則 V/R __ .sql 這是Flyway約定的腳本文件命名。

腳本文件命名規則

Flyway的腳本文件命名有如下規則:
首先是大寫字母 V/R,而後是版本號,要是有小版本能夠用下劃線隔開,例如 2_1,版本號後面是兩個下劃線,而後是腳本名稱,文件後綴是 .sql。測試

  1. 以V或者R開頭
    • V表示這個腳本是版本控制腳本,只會執行一次,若是在執行以後修改該腳本,則運行flyway.migrate()時flyway會報錯(checksum校驗失敗);
    • R表示這是個可重複運行腳本,每次修改這個腳本,flyway.migrate()執行時都會再次執行這個腳本;
  2. 版本號
    版本號之間若是有小版本,如下劃線隔開
  3. 版本修改說明
    版本號和版本修改說明之間以兩個下劃線隔開,版本說明的單詞之間如下劃線隔開

例如V1_0_0_3__change_thing_parent_to_code.sql,則是說明這是一個版本號爲1.0.0.3的數據庫版本腳本,說明就是change thing parent to code。編碼

Flyway可配置項

默認狀況下建議遵循Flyway的默認約定,就能夠很流暢地使用flyway進行數據庫版本控制了。若是確實須要作一些調整,Flyway的約定項都是能夠配置的,參照如下:spa

spring:
  flyway:
    # 是否啓用flyway
    enabled: true
    # 編碼格式,默認UTF-8
    encoding: UTF-8
    # 遷移sql腳本文件存放路徑,默認db/migration
    locations: classpath:db/migration
    # 遷移sql腳本文件名稱的前綴,默認V
    sql-migration-prefix: V
    # 遷移sql腳本文件名稱的分隔符,默認2個下劃線__
    sql-migration-separator: __
    # 遷移sql腳本文件名稱的後綴
    sql-migration-suffixes: .sql
    # 遷移時是否進行校驗,默認true
    validate-on-migrate: true
    # 當遷移發現數據庫非空且存在沒有元數據的表時,自動執行基準遷移,新建schema_version表
    baseline-on-migrate: true

Flyway使用配置

Spring Boot方式

  1. POM
    pom裏引入依賴
    <dependency>
         <groupId>org.flywaydb</groupId>
         <artifactId>flyway-core</artifactId>
     </dependency>
  2. 創建文件夾
    在resources文件夾下新建文件夾db/migrate
  3. 編寫SQL腳本
相關文章
相關標籤/搜索