一、Flyway
1.1 介紹
Flyway 是用來進行數據庫的版本控制,幫助用戶完成數據庫遷移的工作。使用 Flyway ,用戶可以從任意一個數據庫版本遷移到最新版本,簡單而且有效。
1.3 使用場景
- 適合團隊共同維護數據庫結構,而不是將數據庫版本維護工作統一交給一個人處理。
- 方便為不同的環境,維護數據庫版本
1.4 工作原理
1) 在數據庫中維護一張名為 flyway_schema_history 的元數據表,里面存儲着已執行的各個版本的記錄;
2) 掃描系統文件或者應用的類路徑中特定的文件,它們可以由 SQL 或 Java 編寫。
3) 基於文件的版本號進行排序
4) 與元數據表進行校驗,如果版本號低於或等於當前標記的版本,它們將被忽略,高於標記的文件將會被執行並更新元數據表
1.5 運行方式
- 基於命令行模式,用戶從官網下載工具包,進行一些必要的配置,就可以通過命令行使用其功能。
- 基於Java API,用戶可以將 Flyway 提供的第三方包加入 classpath,通過 Flyway 提供的 API 來使用其功能。
- 基於 Maven 或 Gradle,用戶可以通過配置插件,運行 mvn 或 gradle 命令來使用其功能。
1.6 腳本文件命名規則
V<VERSION>__<NAME>.sql
- 大寫字母 V 開頭
- 版本號,小版本號可以用下划線隔開,如 2_1
- 腳本名稱,腳本名稱和版本號之間以兩個下划線隔開
- 文件后綴為 .sql
二、 基於 SpringBoot 下使用 flyway
2.1 引入 pom 依賴
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>6.5.7</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2.2 創建腳本文件
flyway 默認存放路徑是 src/main/resources/db/migration
這里我們采用自定義的目錄
src/main/resources/db/dev/v1
在目錄中新建 V1_1__createTable.sql 文件,內容如下:
CREATE TABLE `sys_user` (
`user_id` bigint(21) NOT NULL COMMENT '用戶編碼',
`user_name` varchar(50) DEFAULT NULL COMMENT '用戶名',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.3 配置應用屬性
在 application.yml 文件中填寫上數據庫和 flyway 相關配置:
spring:
# flyway 相關配置
flyway:
# 啟用 flyway
enabled: true
# 字符集編碼
encoding: utf-8
# 腳本文件存放地址,默認存放地址為 classpath:db/migration
locations: classpath:db/dev
# 數據庫相關配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/flyway_test?serverTimezone=UTC&useUnicode=true&useSSL=false&useUnicode=true&characterEncoding=utf8
username: root
password: sa000
2.4 啟動應用
查看數據庫,發現新增了如下兩張表:
查看 flyway_schema_history 表:
可以看到執行的版本記錄
三、 flyway 遇到的問題
3.1 在非空數據庫下執行
默認情況下在非空數據庫下執行,會拋出異常:
Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s) `test` but no schema history table. Use baseline() or set baselineOnMigrate to true to initialize the schema history table.
配置屬性baseline-on-migrate 為 true 即可:
spring:
flyway:
# 在沒有元數據表的情況下,針對非空Schema執行遷移時是否自動調用基線。 (默認值:false)
baseline-on-migrate: true
# 配合 baseline-on-migrate 使用,否則 V1 的版本不會執行
baseline-version=0: