SpringBoot使用Flyway進行數據庫管理


# Flyway是什么

Flyway是一款數據庫遷移(migration)工具。簡單點說,就是在你部署應用的時候,幫你執行數據庫腳本的工具。Flyway支持SQL和Java兩種類型的腳本,你可以將腳本打包到應用程序中,在應用程序啟動時,由Flyway來管理這些腳本的執行,這些腳本被Flyway稱之為migration。

 

就目前而言,我們部署應用的流程大概是這樣的:

  • 開發人員將應用程序打包、按順序匯總並整理數據庫升級腳本
  • DBA拿到數據庫升級腳本檢查、備份、執行,以完成數據庫升級
  • 應部署人員拿到應用部署包,備份、替換,以完成應用程序升級

引入Flyway之后的應用部署流程大概是這樣的:

  • 開發人員將應用程序打包
  • 應部署人員拿到應用部署包,備份、替換,以完成應用程序升(Flyway將自動執行升級/備份腳本)

 

# SpringBoot如何集成使用

如果創建項目時就選擇了 Flyway 依賴,就會有db/migration這個目錄。后期集成 Flyway,這個目錄就需要我們手動創建了。

<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>

 

然后在 resources 目錄下,手動創建 db/migration 目錄,並在該目錄下創建數據庫腳本,數據庫腳本的命名方式如下:

V<VERSION>__<NAME>.sql

首先是大寫字母 V,然后是版本號,要是有小版本可以用下划線隔開,例如 2_1,版本號后面是兩個下划線,然后是腳本名稱,文件后綴是 .sql。

例如我這里創建我的第一個數據庫腳本,取名為 V1.0__initialize.sql 。

 

項目啟動,Flyway 會自動創建一個 flyway_schema_history 表,這個表用來記錄數據庫的更新歷史。

有了這條記錄,下次再啟動項目,V1.0__initialize.sql 這個腳本文件就不會執行了,因為系統知道這個腳本已經執行過了,如果你還想讓 V1__vhr.sql 腳本再執行一遍,需要手動刪除 flyway_schema_history 表中的對應記錄,那么項目啟動時,這個腳本就會被執行了。

 

# 注意

  1. 我們在定義腳本的時候,除了 V 字開頭的腳本之外,還有一種 R 字開頭的腳本,V 字開頭的腳本只會執行一次,而 R 字開頭的腳本,只要腳本內容發生了變化,啟動時候就會執行。
  2. 使用了 Flyway 之后,如果再想進行數據庫版本升級,就不用該以前的數據庫腳本了,直接創建新的數據庫腳本,項目在啟動時檢測了有新的更高版本的腳本,就會自動執行,這樣,在和其他同事配合工作時,也會方便很多。因為正常我們都是從 Git 上拉代碼下來,不拉數據庫腳本,這樣要是有人更新了數據庫,其他同事不一定能夠收到最新的通知,使用了 Flyway 就可以有效避免這個問題了。
  3. 所有的腳本,一旦執行了,就會在 flyway_schema_history 表中有記錄,如果你不小心搞錯了,可以手動從 flyway_schema_history 表中刪除記錄,然后修改 SQL 腳本后再重新啟動(生產環境不建議)。

 

# Flyway配置

  • 在 Spring Boot 中,關於 Flyway 也有不少配置,這些配置都在 application.properties 中進行配置,常用的幾個來和大家說下:
  • spring.flyway.enabled:是否開啟 flyway,默認就是開啟的
  • spring.flyway.encoding:flyway 字符編碼
  • spring.flyway.locations:sql 腳本的目錄,默認是 classpath:db/migration,如果有多個,用 , 隔開
  • spring.flyway.clean-disabled:這個屬性非常關鍵,它表示是否要清除已有庫下的表,如果執行的腳本是 V1__xxx.sql,那么會先清除已有庫下的表,然后再執行腳本,這在開發環境下還挺方便,但是在生產環境下就要命了,而且它默認就是要清除,生產環境一定要自己配置設置為 true。
  • spring.flyway.table:配置數據庫信息表的名稱,默認是 flyway_schema_history。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM