zoukankan      html  css  js  c++  java
  • 数据库迁移工具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的执行记录。

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

  • 相关阅读:
    用OKR让你的员工嗨起来
    用数据让我们的OKR变得“冷酷”却更有价值
    好的想法只是OKR的开始创业者谨记
    “OKR播种机”JOHN DOERR–目标是对抗纷乱思绪的一针疫苗
    用OKR提升员工的执行力
    OKR的两个基本原则
    《OKR工作法》| 一次说太多等于什么都没说
    《OKR工作法》–让所有人承担自己的职责
    《OKR工作法》——打造一支专一的团队
    Oracle wm_concat()函数的实际运用
  • 原文地址:https://www.cnblogs.com/charlypage/p/15547036.html
Copyright © 2011-2022 走看看