1.簡介
Flyway 是一個開源的數據庫遷移工具。它強烈支持簡單性和約定而不是配置。它僅基於 7 個基本命令: Migrate、 Clean、 Info、 Validate、 Undo、 Baseline和 Repair。
遷移可以用SQL (支持特定於數據庫的語法(例如 PL/SQL、T-SQL 等))或Java (用於高級數據轉換或處理 LOB)編寫。
它有一個命令行客戶端。如果您使用的是 JVM,我們建議您使用Java API 在應用程序啟動時遷移數據庫。或者,您也可以使用Maven 插件 或Gradle 插件。
如果這還不夠,還有 適用於 Spring Boot、Dropwizard、Grails、Play、SBT、Ant、Griffon、Grunt、Ninja 等的插件!
Flyway的GitHub地址如下:
https://github.com/flyway/flyway
2.數據遷移
Flyway 對數據庫的所有更改都稱為遷移。遷移可以是版本化的或 可重復的。版本化遷移有兩種形式:常規和撤消。
版本化遷移有一個版本、一個描述和一個校驗和。版本必須是唯一的。該描述純粹是提供信息,讓您能夠記住每次遷移的作用。校驗和用於檢測意外更改。版本化遷移是最常見的遷移類型。它們只按順序應用一次。
可選地,可以通過提供具有相同版本的撤消遷移來撤消它們的影響。可重復的遷移有描述和校驗和,但沒有版本。不是只運行一次,而是在每次校驗和更改時(重新)應用它們。
在單個遷移運行中,可重復的遷移總是最后應用,在所有掛起的版本化遷移都已執行之后。可重復遷移按其描述的順序應用。默認情況下,版本化和可重復遷移都可以用SQL 或Java編寫,並且可以由多個語句組成。
Flyway 自動發現文件系統和 Java類路徑上的遷移。為了跟蹤哪些遷移已在何時以及由誰應用,Flyway 向您的架構添加了一個架構歷史記錄表。
3.使用示例
項目結構:
├─.idea
│ └─libraries
├─.mvn
│ └─wrapper
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─flywaydemo
│ │ └─resources
│ │ └─db
│ │ └─migration
│ └─test
│ └─java
│ └─com
│ └─flywaydemo
└─target
├─classes
│ ├─com
│ │ └─flywaydemo
│ └─db
│ └─migration
├─generated-sources
│ └─annotations
├─generated-test-sources
│ └─test-annotations
└─test-classes
└─com
└─flywaydemo
maven依賴:
<dependencies>
<!--引入flyway-->
<dependency>
<groupId>org.flywaydb</groupI
<artifactId>flyway-core</arti
<!--可根據GitHub最新版本編寫-->
<version>6.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.
<artifactId>spring-boot-start
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j
</dependency>
<dependency>
<groupId>org.springframework.
<artifactId>spring-boot-start
</dependency>
<dependency>
<groupId>org.springframework.
<artifactId>spring-boot-start
<scope>test</scope>
</dependency>
</dependencies>
在resources文件夾下創建db/migration目錄,在此目錄中創建sql腳本,格式為:版本號+分隔符+描述,如V1.0__v1__Init_Table.sql。示例sql如下:
CREATE TABLE `t_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '賬號id',
`name` varchar(63) COLLATE utf8mb4_general_ci DEFAULT NULL,
`password` varchar(200) COLLATE utf8mb4_general_ci NOT NULL COMMENT '賬號密碼',
`phone` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手機號',
`email` varchar(30) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '郵箱',
`enable` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否啟用',
`createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
application.yml文件:
spring:
# 數據庫連接配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT&allowPublicKeyRetrieval=true
username: root
password: root
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
然后啟動項目,控制台正常輸出后后查看數據。
在數據庫中查看相關的數據變更,可以看到flyway_schema_history表插入了sql的執行記錄。
查看插入的數據表如下所示。