数据库迁移工具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的执行记录。

查看插入的数据表如下所示。

posted @ 2021-11-12 23:45  城南少年与猫  阅读(1089)  评论(0编辑  收藏  举报