flyway,是一款数据库迁移工具,支持SQL脚本的自动备份和执行,在项目中非常方便我们进行部署应用到多套环境中初始化数据库或者升级数据库表的自动化工作。
一、为什么要用flyway
我们类比一下现在经常用到的Git版本控制工具,能够很好的管控我们的代码库版本,实现版本回溯、版本回退、版本提交等功能。
而flyway实际上就是针对数据库层面的一种版本控制工具,它也能够很好的支持数据库版本的回溯、版本回退、版本提交等功能。
在项目初建的时候我们可能需要将项目代码到多个环境中,比如开发环境、测试环境,并且数据库分成了开发库和测试库,同时我们还经常需要在开发过程中不断的去变更表结构。如果不引入flyway,那么我们只能手动去同步开发库与测试库,但是如果我们使用了flyway,那么我们只要将项目进行成功部署就可以实现数据库表结构自动同步。
二、怎么用flyway
-
首先引入pom依赖
<!-- mysql驱动器 这里以8版本为例 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency> <!--数据库版本控制--> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>5.2.1</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.0</version> </dependency>
-
配置文件
server: port: 8000 spring: application: name: myflyway datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/myflyway?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC 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
-
初始化数据库环境
新建myflyway库
-
创建DDL脚本
创建脚本名称规范:
例如我创建第一个版本的建表的sql脚本文件,且表名为test,并取名为:V1.0.0_001_ddl_test.sql
UNLOCK TABLES;
CREATE TABLE IF NOT EXISTS `test` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '自增id主键',
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '姓名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;
UNLOCK TABLES;
将该文件放在resource/db/migration下
-
启动项目
可以看到我们的ddl脚本语句被成功执行,并且会自动创建一张flyway_schema_history表,里面记录了执行历史。
参考项目地址:https://gitee.com/dearvainycos/myflyway
其中踩了一个坑,假如我们使用了mysql作为数据库,那么使用flyway必须在pom文件中引入对应的mybatis依赖,否则将不会生效。
参考资料: