数据库迁移工具flyway的使用与详解
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的执行记录。
查看插入的数据表如下所示。