使用Flyway管理你的Spring boot數據庫版本

引言

Flyway是一款開源的數據庫版本管理工具,它更傾向於規約優於配置的方式。Flyway能夠獨立於應用實現管理並跟蹤數據庫變動,支持數據庫版本自動升級,而且有一套默認的規約,不須要複雜的配置,Migrations能夠寫成SQL腳本,也能夠寫在Java代碼中,不只支持Command Line和Java API,還支持Build構建工具和Spring Boot等,同時在分佈式環境下可以安全可靠地升級數據庫,同時也支持失敗恢復等。spring

一般在項目上線後,因爲需求的不斷改進或功能的完善須要對個別字段進行調整或新增。若是採用傳統方式直接修改開發和生產數據庫但凡涉及人爲操做總沒法避免出錯的可能。一種方法是避免直接修改數據庫,全部數據庫修改經過PDM去操做。固然畢竟PDM是花錢的,經過採用Flyway編寫變動腳本的方式,能夠使應用在啓動時檢查數據庫變動並進行自動同步。sql

版本

  • 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.pngapp

  • prefix: 可配置,前綴標識,默認值V表示Versioned,R表示Repeatable
  • version: 標識版本號,由一個或多個數字構成,數字之間的分隔符可用點.或下劃線_
  • separator: 可配置,用於分隔版本標識與描述信息,默認爲兩個下劃線__
  • description: 描述信息,文字之間能夠用下劃線或空格分隔
  • suffix: 可配置,後續標識,默認爲.sql

要實如今Spring boot中使用Flyway進行版本管理須要作到以下步驟:分佈式

1. 添加依賴  
2. 來點配置
3. 編寫腳本

這裏示例以一個存在若干張表的數據庫爲例,爲該庫添加一張新的test_alpha表,而後追加一列bravo工具

1.添加依賴ui

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

2.來點配置 application.yaml編碼

# flyway配置 對於非空數據庫 須要開啓此項避免報錯
spring:
 flyway:
  baseline-on-migrate: true

3.準備腳本url

依據上文描述的命名規則,在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 。
相關文章
相關標籤/搜索