SpringBoot 集成 Flyway
- Flyway简介
- 为什么使用Flyway
- SpringBoot集成Flyway
Flyway 简介
Flyway 是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway 可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations 可以写成 SQL 脚本,也可以写在 Java 代码中,不仅支持 Command Line 和 Java API,还支持 Build 构建工具和 Spring Boot 等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。
基于7个基本命令: 迁移, 清理, 信息, 验证, 撤消, 基线和 修复。
版本化的迁移
Flyway 最常见的就是版本化迁移,每一个版本的迁移都有一个版本,一个描述和一个校验和。版本必须是唯一的。该描述为您提供了信息,使您能记住每个迁移的工作。效验和用于检测意外更改。版本化迁移仅按顺序应用一次。
版本化的迁移通常用于:
- 创建/更改/删除表/索引/外键/枚举/ UDT /…
- 数据更新
- 用户数据更正
这是一个小例子:
CREATE TABLE car (
id INT NOT NULL PRIMARY KEY,
license_plate VARCHAR NOT NULL,
color VARCHAR NOT NULL
);
ALTER TABLE owner ADD driver_license_id VARCHAR;
INSERT INTO brand (name) VALUES ('DeLorean');
必须为每个版本化的迁移分配一个唯一的版本。只要符合通常的点分符号,任何版本都是有效的。在大多数情况下,只需要一个简单的递增整数即可。但是Flyway非常灵活,所有这些版本都是有效的版本迁移版本:
- 1个
- 001
- 5.2
- 1.2.3.4.5.6.7.8.9
- 205.68
- 20130115113556
- 2013.1.15.11.35.56
- 2013.01.15.11.35.56
为什么使用Flyway
在日常的开发中,我们使用git管理代码的版本,那么数据库的版本呢?使用flyway。
个人认为,可以大概的将flyway理解为数据库的git,方便多人协作及记录。
git:让你和同事更加轻松的维护同一个项目,你可以很方便的获取到他最新提交的改动。
flyway:让你及时的知道同事对数据库的改动并且能够自动在你的本地执行这些改动。
SpringBoot集成Flyway
新建一个SpringBoot的基础项目
- 导入依赖
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-data-jpa</artifactId>-->
<!--</dependency>-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
spring-boot-starter-data-jpa,mybatis-spring-boot-starter 可以选择其中一个导入,因为Flyway用到其中的数据库注解。
- 配置数据库和Flyway
Flyway默认可以不用配置,可以选择性的配置。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?createDatabaseIfNotExist=true&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
username: root
password: root
flyway:
# 如果启动的时候需要flyway管理sql脚本的话,将enabled设置为true
enabled: true
# 如果数据库不是空表,需要设置成 true,否则启动报错
baseline-on-migrate: true
# 验证错误时 是否自动清除数据库 高危操作!
clean-on-validation-error: false
- 添加基础数据库sql
在resource,db.migration文件中新建V1.1__schema.sql,V2.1__data.sql
V1.1__schema.sql
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
V2.1__data.sql
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
注意:数据库sql名称的下划线为两个下划线。V2.1__data.sql
到此,SpringBoot集成Flyway完成。
源码地址:https://github.com/lbshold/springboot/tree/master/SpringBoot-Flyway