Flyway簡介及使用

Java低端碼農發表於2020-12-04

Flyway簡介及使用

1、簡介

1.1 Flyway是什麼?

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

關於Flywayhttps://flywaydb.org/

1.2為什麼要使用Flyway

在真實的專案開發中,我們每個人都會有一個應用軟體和與其相聯絡的資料庫。對於個人開發來說,這樣就夠了。但是,專案開發一般都不止一個人,因此一定會出現我在我的本地有一套軟體和相應的資料庫系統,我的另一個同事會在他的本地有一套他自己的軟體和相應的資料庫系統。我們需要面臨的第一個問題就是我們兩個人如何整合我們的資料庫系統,之後還要處理如何將資料庫系統遷移到測試環境和生產環境當中去。


1.3 flyway工作原理

一言以蔽之:flyway通過歷史記錄表(flyway_schema_history)來記錄版本歷史。每次隨專案啟動時將會自動掃描在resources/db/migration下的檔案並查詢flyway_schema_history判斷是否為新增檔案。如果是新增的檔案,則執行該遷移檔案。如果不是,則忽略。

當flyway在一個空資料庫執行時,它將直接建立一張預設名為flyway_schema_history的資料記錄為空的歷史記錄表,這張表將被用來跟蹤或記錄資料庫的狀態。爾後flyway將會開始掃描文件系統或專案classpath路徑下的遷移檔案。

在這裡插入圖片描述

flyway按版本號順序排列遷移檔案,並按序執行,並更新歷史記錄表中的內容:

在這裡插入圖片描述

當專案再次發版時,flyway會再次掃描遷移檔案,然後將遷移文的版本號與歷史記錄表中的版本號進行對比。flyway會忽略版本號小於等於表中當前最大版本的遷移檔案,剩餘待執行遷移檔案會按版本號升序執行。(譯者注:並非真正忽略,而是會校驗checksum值是否一致,以此來保證歷史版本檔案未被篡改。)

在這裡插入圖片描述

歷史記錄表變動如下:

在這裡插入圖片描述

所以每次當你打算升級資料庫時(包含DDL、DML語句),只需要在指定路徑下建立一個版本號大於歷史記錄表中當前最大的版本號的遷移檔案即可。在下次flyway啟動時(隨專案啟動或其他形式),資料庫將會自動完成升級,你無須再手動執行指令碼。

2、使用

2.1 整合Spring Boot

2.1.1 建立Migration目錄

在工程的 src/main/resources 目錄下建立db/migration目錄(Flyway載入Migrations時的預設Locations)

2.1.2 Maven配置:pom檔案新增依賴

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>${flyway.version}</version>
</dependency>

2.1.3 專案配置檔案(yml)

flyway:
    baseline-description: baseline init
    baseline-on-migrate: true
    schemas: ${postgresql.pylon.database}
    locations: classpath:db/migration/gateway/
    baseline-version: 1.0.101
flyway配置詳解

flyway.baseline-description對執行遷移時基準版本的描述.
flyway.baseline-on-migrate當遷移時發現目標schema非空,而且帶有沒有後設資料的表時,是否自動執行基準遷移,預設false.
flyway.baseline-version開始執行基準遷移時對現有的schema的版本打標籤,預設值為1.
flyway.check-location檢查遷移指令碼的位置是否存在,預設false.
flyway.clean-on-validation-error當發現校驗錯誤時是否自動呼叫clean,預設false.
flyway.enabled是否開啟flywary,預設true.
flyway.encoding設定遷移時的編碼,預設UTF-8.
flyway.ignore-failed-future-migration當讀取後設資料表時是否忽略錯誤的遷移,預設false.
flyway.init-sqls當初始化好連線時要執行的SQL.
flyway.locations遷移指令碼的位置,預設db/migration.
flyway.out-of-order是否允許無序的遷移,預設false.
flyway.password目標資料庫的密碼.
flyway.placeholder-prefix設定每個placeholder的字首,預設${.
flyway.placeholder-replacementplaceholders是否要被替換,預設true.
flyway.placeholder-suffix設定每個placeholder的字尾,預設}.
flyway.placeholders.[placeholder name]設定placeholder的value
flyway.schemas設定需要flywary遷移的schema,大小寫敏感,預設為連線預設的schema.
flyway.sql-migration-prefix遷移檔案的字首,預設為V.
flyway.sql-migration-separator遷移指令碼的檔名分隔符,預設__
flyway.sql-migration-suffix遷移指令碼的字尾,預設為.sql
flyway.tableflyway使用的後設資料表名,預設為schema_version
flyway.target遷移時使用的目標版本,預設為latest version
flyway.url遷移時使用的JDBC URL,如果沒有指定的話,將使用配置的主資料來源
flyway.user遷移資料庫的使用者名稱
flyway.validate-on-migrate遷移時是否校驗,預設為true.


Spring Boot 將會自動管理Flyway的啟動和執行。然後Flyway會預設在你的專案的CLASSPATH路徑下的db/migration目錄下(在我們的專案一般就是src/main/resources/db/migration裡面)查詢SQL指令碼。將你的SQL指令碼寫完然後放入此路徑下後就可以執行你的專案,Spring會自動建立Flyway的Bean來處理你的指令碼。

 

 

相關文章