1. 程式人生 > >使用Flyway管理你的Spring boot資料庫版本

使用Flyway管理你的Spring boot資料庫版本

開發十年,就只剩下這套架構體系了! >>>   

引言

Flyway是一款開源的資料庫版本管理工具,它更傾向於規約優於配置的方式。Flyway可以獨立於應用實現管理並跟蹤資料庫變更,支援資料庫版本自動升級,並且有一套預設的規約,不需要複雜的配置,Migrations可以寫成SQL指令碼,也可以寫在Java程式碼中,不僅支援Command Line和Java API,還支援Build構建工具和Spring Boot等,同時在分散式環境下能夠安全可靠地升級資料庫,同時也支援失敗恢復等。

通常在專案上線後,由於需求的不斷改進或功能的完善需要對個別欄位進行調整或新增。如果採用傳統方式直接修改開發和生產資料庫但凡涉及人為操作總無法避免出錯的可能。一種方法是避免直接修改資料庫,所有資料庫修改通過PDM去操作。當然畢竟PDM是花錢的,通過採用Flyway編寫變更指令碼的方式,可以使應用在啟動時檢查資料庫變更並進行自動同步。

版本

  • Flyway: 5.1.4
  • Gradle: 4.10
  • Spring Boot: 2.0.4

步驟

Flyway對資料庫進行版本管理主要由Metadata表和6種命令完成,Metadata主要用於記錄元資料,在Flyway首次啟動時會建立預設名為flyway_schema_history

的元資料表,該表用於記錄版本變更日誌、Checksum等資訊。

Flyway指令碼的命名規則如下:

sql_migration_naming.png

  • prefix: 可配置,字首標識,預設值V表示Versioned,R表示Repeatable
  • version: 標識版本號,由一個或多個數字構成,數字之間的分隔符可用點.或下劃線_
  • separator: 可配置,用於分隔版本標識與描述資訊,預設為兩個下劃線__
  • description: 描述資訊,文字之間可以用下劃線或空格分隔
  • suffix: 可配置,後續標識,預設為.sql

要實現在Spring boot中使用Flyway

進行版本管理需要做到如下步驟:

1. 新增依賴  
2. 來點配置
3. 編寫指令碼

這裡示例以一個存在若干張表的資料庫為例,為該庫新增一張新的test_alpha表,然後追加一列bravo

1.新增依賴

 compile "org.flywaydb:flyway-core:5.1.4"

2.來點配置 application.yaml

# flyway配置 對於非空資料庫 需要開啟此項避免報錯
spring:
 flyway:
  baseline-on-migrate: true

3.準備指令碼

依據上文描述的命名規則,在src\main\resources\db\migration下新增你的資料庫變更指令碼,這裡需要注意的是,由於我們是在非空資料庫進行操作,所以這裡的版本號是從v2開始。

V2__Add_new_table.sql

DROP TABLE IF EXISTS flyway_test_alpha;
CREATE TABLE `flyway_test_alpha`  (
    `id`            int(11) AUTO_INCREMENT NOT NULL,
    `column_alpha`  varchar(30) NULL,
    PRIMARY

V3__Add_column.sql

ALTER TABLE `flyway_test_alpha`
    ADD COLUMN `column_bravo` varchar(25) NULL

現在啟動你的應用,你會發現這兩項操作會隱士完成了,實在是非常省心。

附錄: Flyway配置詳解

flyway.baseline-description= # 執行基線時標記已有Schema的描述
flyway.baseline-version=1 # 基線版本預設開始序號 預設為 1. 
flyway.baseline-on-migrate=false # 針對非空資料庫是否預設呼叫基線版本 , 這也是我們上面版本號從 2 開始的原因
flyway.check-location=false # 是否開啟指令碼檢查 檢查指令碼是否存在 預設false
flyway.clean-on-validation-error=false # 驗證錯誤時 是否自動清除資料庫 高危操作!!!
flyway.enabled=true # 是否啟用 flyway.
flyway.encoding=UTF-8 # 指令碼編碼.
flyway.ignore-failed-future-migration=true # 在讀元資料表時,是否忽略失敗的後續遷移.
flyway.init-sqls= # S獲取連線後立即執行初始化的SQL語句
flyway.locations=classpath:db/migration # 指令碼位置, 預設為classpath: db/migration.
flyway.out-of-order=false # 是否允許亂序(out of order)遷移
flyway.placeholder-prefix= # 設定每個佔位符的字首。 預設值: ${ 。 
flyway.placeholder-replacement=true # 是否要替換佔位符。 預設值: true 。 
flyway.placeholder-suffix=} # 設定佔位符的字尾。 預設值: } 。 
flyway.placeholders.*= # 設定佔位符的值。
flyway.schemas= # Flyway管理的Schema列表,區分大小寫。預設連線對應的預設Schema。
flyway.sql-migration-prefix=V # 遷移指令碼的檔名字首。 預設值: V 。 
flyway.sql-migration-separator=__ # 遷移指令碼的分割符 預設雙下劃線
flyway.sql-migration-suffix=.sql # 遷移指令碼的字尾 預設 .sql
flyway.table=schema_version # Flyway使用的Schema元資料表名稱 預設schema_version
flyway.url= # 待遷移的資料庫的JDBC URL。如果沒有設定,就使用配置的主資料來源。
flyway.user= # 待遷移資料庫的登入使用者。
flyway.password= # 待遷移資料庫的登入使用者密碼。
flyway.validate-on-migrate=true # 在執行遷移時是否要自動驗證。 預設值: true 。