Flyway 介紹
Flyway是一個簡單開源數據庫版本控制器(約定大於配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客戶端等,還提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。
Flyway 可以獨立於應用實現管理並跟蹤數據庫變更,支持數據庫版本自動升級,並且有一套默認的規約,不需要複雜的配置,Migrations 可以寫成 SQL 腳本,也可以寫在 Java 代碼中,不僅支持 Command Line 和 Java API,還支持 Build 構建工具和 Spring Boot 等,同時在分佈式環境下能夠安全可靠地升級數據庫,同時也支持失敗恢復等。
Spring Boot 整合 Flyway
引入依賴
在 Spring Boot 項目中引入 Flyway 相關 Maven 依賴:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>6.1.0</version>
</dependency>
注意,如果 flyway-core 的依賴版本在 6.0 以上時,spring-boot-starter-parent 的版本需要在 2.2 以上,例如:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/>
</parent>
如果 spring-boot-starter-parent 版本在 2.2 以下的,那麼在啓動項目時會報如下錯誤:
ClassNotFoundException: org.flywaydb.core.api.callback.FlywayCallback
MySQL 版本
注意 MySQL 版本必須在 5.7 以上,否則在啓動項目時會報 MySQL 版本過低的錯誤。
添加版本化 SQL
在項目的 src/main/resources 下創建 db/migration 目錄,該目錄下放置需要數據遷移的文件。
數據遷移文件名稱格式爲:V1.1__DoSomething.sql
注意,版本和文件名之間是兩個下劃線。
分別創建三個 sql 文件:
- V1.0__CreateUser.sql
DROP TABLE IF EXISTS jira_user; CREATE TABLE `jira_user` ( `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `user_name` varchar(20) NOT NULL COMMENT '姓名', `age` int(5) DEFAULT NULL COMMENT '年齡', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- V1.1__ModifyUser.sql
alter table jira_user modify column user_name varchar(30);
- V1.2__InsertUsers.sql
insert into jira_user values (1, 'Jake Weng', 27); insert into jira_user values (2, 'Heather Wen', 27);
查看數據庫
啓動上面建立好的 Spring Boot 項目,查看 MySQL 數據庫,會發現數據庫中多了 flyway_schema_history 和 jira_user 兩張表。
查看 flyway_schema_history,可以觀察到 sql 的歷史版本:
查看 jira_user,可以查看到在 V1.3 中插入的數據: