FlyWay入门教程

Flyway

Flyway by Redgate • 数据库迁移变得简单。 ---- 数据库的版本控制

1. 概述

Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。

用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。

应用场景:

在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表也会在迭代周期不断迭代。在Java应用程序中使用Flyway,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的。

适用人员:

  • 架构人员:搭建框架初始数据库的;
  • 开发人员:在Flyway框架下做sql改动的;

支持的数据库包括:

image-20220818131622705

2. 工作原理与基本概念

工作原理概述

当 Flyway 连接数据库中的 schema 后,会先检查是否已存在 flyway_schema_history 表,如果没有则创建。该表用于跟踪数据库的状态,如数据迁移的版本,迁移成功状态等信息。

flyway_schema_history 表结构:

image-20220818141409855

flyway_schema_history 存在后,Flyway 会扫描文件系统或应用中的 classpath 目录的数据迁移文件,然后根据它们的版本号进行按序迁移,如下图:

img

由于 flyway_schema_history 表中记录了迁移的版本号,如果文件的版本号小于或等于标记为当前版本的版本号,则忽略它们不执行。(并非真正忽略,而是会校验checksum值是否一致,以此来保证历史版本文件未被篡改)

所以每次当你打算升级数据库时(包含DDL、DML语句),只需要在指定路径下创建一个版本号大于历史记录表中当前最大的版本号的迁移文件即可。在下次flyway启动时(随项目启动或其他形式),数据库将会自动完成升级,你无须再手动执行脚本。

基本概念

Migration(迁移)

使用 Flyway,对数据库的所有更改都称为迁移。迁移可以是版本化的或 可重复的。版本化迁移有两种形式:常规和撤消

Migration的方式包括:

  • SQL
  • Java
  • 脚本

迁移最常使用SQL编写。这使得上手和利用任何现有的脚本、工具和技能变得容易。它使您可以访问数据库的全部功能,并且无需了解任何中间翻译层。

基于 SQL 的迁移通常用于

  • DDL 更改(TABLES、VIEWS、TRIGGERS、SEQUENCES……的 CREATE/ALTER/DROP 语句)
  • 简单的参考数据更改(参考数据表中的 CRUD)
  • 简单的批量数据更改(常规数据表中的 CRUD)

**命名:**为了被 Flyway 采用,SQL migrations 必须符合以下命名模式:

image-20220818162235059

3. 安装和基本使用

命令行

Flyway 命令行工具是一个独立的 Flyway 发行版。它在 Windows、macOS 和 Linux 上运行,主要适用于希望从命令行迁移数据库而无需将 Flyway 集成到其应用程序中也无需安装构建工具的用户。 Flyway命令行工具下载地址

注意:Flyway社区版删除了Mysql5.7的支持!!!!社区版不支持undo等命令

安装

目录结构

image-20220818135026929

配置环境变量

# Win+R 输入:
rundll32.exe sysdm.cpl,EditEnvironmentVariables

添加目录到环境变量:

image-20220818143441301

添加到path中:

image-20220818143702882

使用命令行测试环境变量:

image-20220818143842268

使用

示例前置条件: 一个名为 flyway的MySQL数据库。

image-20220818155834175

  1. 配置数据库连接信息

    conf/flyway.conf中配置如下信息:

    image-20220818150814144

  2. 配置sql文件路径

    flyway.locations=filesystem:\\D:\Flyway\flyway-commandline-9.1.5-windows-x64\flyway-9.1.5\sql
    
  3. 添加sql脚本

    image-20220818160444917

  4. 执行命令flyway migrate

    image-20220818160404109

  5. 查看数据库中的表信息

    image-20220818160608227

  6. 再次执行flyway migrate

    在这里插入图片描述

    因为当前sql文件与之前没有变化,所以不会执行任何sql。

命令
  1. migrate

    # 将架构迁移到最新版本。如果Flyway不存在,它将自动创建架构历史记录表。
    flyway migrate
    

    迁移

  2. clean

    # Clean 对开发和测试有很大帮助。通过彻底清除已配置的模式,它将有效地为您提供新的开始。所有对象(表、视图、过程……)都将被删除。注意:谨慎使用,配置中默认禁用
    flyway clean
    

    干净的

  3. info

    # 打印有关所有迁移的详细信息和状态信息。
    flyway info
    

    image-20220818163142367

  4. validate

    # 根据可用的migration验证应用的迁移。验证可帮助您验证应用于数据库的迁移是否与本地可用的迁移相匹配。
    flyway validate
    

    证实

  5. undo

    # 撤消最近应用的版本化迁移。(社区版不支持)
    flyway undo
    

    Undo

  6. baseline

    # Baseline 用于通过在特定版本上对现有数据库进行基线来将 Flyway 引入现有数据库。这将导致Migrate忽略直到并包括基线版本的所有迁移。然后将照常应用较新的迁移。
    flyway baseline
    

    基线

  7. repair

    # 修复Flyway模式历史记录表。这将执行以下操作:
    - 删除失败的迁移条目(仅适用于不支持 DDL 事务的数据库)
    - 将应用迁移的校验和、描述和类型与可用迁移重新对齐
    - 将所有丢失的迁移标记为已删除
    flyway repair
    

    修理

  8. 其他(快照处于测试阶段、check需要.net支持)

Java API

  1. 引入依赖

      <!-- flyway -->
            <dependency>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-core</artifactId>
                <version>5.2.4</version>
            </dependency>
    
  2. 配置迁移文件

    在项目的 src/main/resources 下创建 db/migration 目录,该目录下放置需要数据迁移的文件。

    image-20220818170421389

  3. 编写Java程序

    import org.flywaydb.core.Flyway;
    
    /**
     * @ClassName: FlywayTest
     * @Description: Flyway
     * @Author: Ze WANG
     * @Date: 2022/8/18
     **/
    public class FlywayTest {
        public static void main(String[] args) {
            String url = "jdbc:mysql://ip:3306/flyway?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false&serverTimezone=GMT%2B8";
            String user = "root";
            String password = "123456";
            Flyway flyway = Flyway.configure().dataSource(url, user, password).load();
    
            flyway.migrate();
    
        }
    }
    

    初始化数据库,运行程序观察:

    image-20220818170739390

Spring Boot

前提条件,一个SpringBoot 程序

  1. 引入依赖

    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
    </dependency>
    
  2. 配置application

      flyway:
        enabled: true
    #    默认clean为false,这里为了测试,谨慎使用
        clean-disabled: true
    #    如果数据库不是空表需要配置为true
        baseline-on-migrate: true
        baseline-version: 0
        locations:
          - classpath:db/migration/
    
  3. 启动项目

    # 启动项目后数据库会根据脚本变更
    
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结构化思维wz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值