- 前言
随着开发版本的迭代,数据库的字段的变更在所难免,很早之前我们在发布版本的时候都会自己手动把开发环境的数据库表和字段的变更同步生产环境
当我们有了释放双手的想法的时候 就发现了 Flyway
[Flyway 官方地址](https://flywaydb.org)
- Flyway和SpringBoot整合
-
- 第一步,引入pom.xml依赖
<dependencies>
<!-- 非必要的,启动时候测试用的 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 如下依赖是必须的 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Mybatis 或者 Spring家的ORM框架 不然flyway自动配置不会生效 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!-- 数据库版本控制工具-->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>7.11.4</version>
</dependency>
</dependencies>
-
- 第二步:创建一个数据库,并在yml文件或者properties文件中添加上数据库配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/flyway?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
-
- 第三步:在resource目录下创建db/migration文件夹
然后在创建的文件夹下创建一个V20210826_1__create_person.sql文件
V20210826_1是版本号 默认写法格式:V版本号__xxx.sql
版本号可以有多种写法,日期写法是我比较喜欢的一种写法
<!-- 如下是3个文件的内容 注意版本号必须是保持递增的 -->
<!-- V20210826_1__create_person.sql -->
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(64) DEFAULT NULL COMMENT '姓名',
`birthday` datetime DEFAULT NULL COMMENT '生日',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
<!-- V20210826_2__add_person.sql -->
INSERT INTO `flyway`.`person`(`name`, `birthday`) VALUES ('fun007', '1995-01-02 16:25:32');
<!-- V20210826_3__alter_person.sql -->
ALTER TABLE person MODIFY birthday date COMMENT '生日';
-
- 第四步:直接run起来Springboot项目。观察日志
可以看到我们编写的三个SQL文件都执行了~,然后再去数据库看下(也都成功了 flyway_schema_history记录编写SQL的执行情况)
- 接下来可以看看maven集成flyway插件的用法
先看效果:
-
- 引入插件在pom.xml中
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>7.11.4</version>
<configuration>
<url>jdbc:mysql://127.0.0.1:3306/flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT</url>
<user>root</user>
<password>root</password>
<driver>com.mysql.cj.jdbc.Driver</driver>
</configuration>
</plugin>
插件命令说明
baseline:对于非空数据库做的数据迁移之前先把这些数据信息记录到schema表中,否则保错
clean:清空数据库
info:查看编写SQL的执行状态
migrate:迁移数据,执行SQL文件
repair:修复一些手动改动后版本
undo: 撤销最近做的迁移操作,免费版本不支持
validate: 应用迁移操作之前做的一些校验
- 对于已存在的数据库表处理方式
直接运行启动程序的时候会报错
两种方式解决:
-
- 如果安装了插件:执行 flyway:baseline 再运行程序
- 或者在配置文件添加如下配置
spring:
flyway:
baseline-on-migrate: true
扩展:查看配置文件如何修改一些默认配置
org.springframework.boot.autoconfigure.flyway.FlywayProperties