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的核心就是db.migrate這個文件夾和flyway_schema_history表。db.migrate下每一個sql文件對應flyway_schema_history的一條記錄。
以下圖:
Flyway會在數據庫中維護一張flyway_schema_history表。以下圖:
表中字段說明:數據庫
當引入了flyway的項目啓動時,運行flyway.migrate()方法(Spring Boot引入會自動執行),Flyway會將db.migrate文件夾中的sql腳本和數據庫flyway_schema_history表作對比,當檢測到db.migrate中存在版本號大於flyway_schema_history最新版本的SQL腳本時,就會執行腳本,並更新flyway_schema_history表。運維
Flyway遵循約定大於配置的原則,有一些默認的約定,按照約定建立腳本,flyway就能夠自動識別並執行。spring-boot
屬性 | 約定 | 說明 |
---|---|---|
版本控制表 | flyway_schema_history | 數據庫中版本控制的表名,默認就是flyway_schema_history,可配置 |
腳本路徑 | db/migrate | 默認SQL腳本的存放路徑,是相對於classPath的相對路徑 |
腳本文件命名規則 | V/R
|
這是Flyway約定的腳本文件命名。 |
Flyway的腳本文件命名有如下規則:
首先是大寫字母 V/R,而後是版本號,要是有小版本能夠用下劃線隔開,例如 2_1,版本號後面是兩個下劃線,而後是腳本名稱,文件後綴是 .sql。測試
例如V1_0_0_3__change_thing_parent_to_code.sql,則是說明這是一個版本號爲1.0.0.3的數據庫版本腳本,說明就是change thing parent to code。編碼
默認狀況下建議遵循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
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency>