数据库版本管理框架-Flyway

一、flyway简介

Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。

二、使用Flyway背景

部门开发一直是后端人员自行维护新增脚本,所以每次部署项目测试,都需要后端开发人员将 sql脚本在对应环境数据库上执行一遍,这样就造成有时候脚本文件混乱或者忘记执行,导致一些不必要的麻烦,所以就想要使用一款可以记录SQL文件版本迭代的工具。

三、Springboot集成Flyway

废话少说,我们直接开始进行Springboot的集成吧。
首先看一下Flyway执行流程:
1)Flyway 会扫描配置的脚本目录下的脚本文件;
2)如果历史记录表不存在,则新建历史记录表;
3)如果是一次性执行脚本(V),按版本号从小到大执行迁移脚本,与当前历史表中的版本号做对比,大于当前版本号的脚本才会被执行迁移;
4)如果是可重复执行脚本(R),检查脚本是否有变动,有变动的可重复脚本才会被执行迁移;

1.引入依赖

Springboot2.x版本已经对Flyway有所依赖了,我们直接引入,不需要进行版本的申明,有时你写上版本号还可能被项目自动覆盖哦,这块注意检查一下。

<dependency>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-core</artifactId>
</dependency>

2.配置文件 yml

要迁移的数据库的 DB url。 如果未设置,则使用主要配置的数据源,正常我们的项目都有jdbc的连接信息,我们使用默认就行,无需配置。

pring:
  flyway:
    # 开启 flyway
    enabled: true
    # 检测迁移脚本的路径是否存在,如不存在,则抛出异常
    check-location: true
    # 是否禁用数据库清理
    clean-disabled: true
    # SQL 迁移的编码
    encoding: UTF-8
    # 迁移脚本的位置,默认db/migration.
    locations: classpath:flyway
    # 版本记录信息表
    table: tb_flyway_history
    # SQL 迁移的文件名前缀。
    sql-migration-prefix: V
    # SQL 迁移的文件名分隔符。
    sql-migration-separator: __
    # SQL 迁移的文件名后缀。
    sql-migration-suffixes: .sql
    # 是否在执行迁移时自动调用验证。
    validate-on-migrate: true
    # 迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
    baseline-on-migrate: true

3.新建flyway文件夹和sql文件

  • Flyway 的默认扫描迁移脚本目录在:spring.flyway.locations: classpath:db/migration,用于扫描的迁移脚本目录
  • Flyway 的默认版本变化记录表名称:spring.flyway.table: flyway_schema_history,用于记录所有的版本变化记录

3.1 根据第2步配置了迁移脚本目录,我们在 src/main resources 目录下创建flyway目录,如下图:

在这里插入图片描述

3.2 下面我们创建两个sql脚本,一个创建一张新表,一个插入一条数据,这里的命名规则: V + 版本号 + __ + 表名 + 操作DML类型 + .sql ,如上图:

SQL脚本的命名规则

  • 前缀:V用于版本化(可配置), U用于撤消(可配置)和 R用于可重复迁移(可配置)
  • 版本:带点或下划线的版本可以根据需要分开多个部分(不适用于可重复的迁移)
  • 分隔符 :( __两个下划线)(可配置)
  • 描述:下划线或空格分隔单词
  • 后缀:.sql(配置)
-- V1.0.0__user_create.sql 创建标签表
DROP TABLE IF EXISTS tb_user;
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `user_code` varchar(100) DEFAULT NULL COMMENT '用户code',
  `user_name` varchar(50) DEFAULT NULL COMMENT '用户名称',
  `user_type` int(2) DEFAULT 3 COMMENT '用户类型',
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
 
-- V1.0.1__user_insert.sql 标签表插入数据
INSERT INTO tb_user
(user_code, user_name, user_type)
values("U12345", "张三", 1);

4.修改pom.xml配置

扫描配置文件,许多项目是没有 **/*.sql 配置的,这样在上述的flyway目录下创建完sql启动时就会报错。所以如果你报错了那就配置上吧。

<resource>
   <directory>src/main/resources</directory>
   <includes>
     <include>bootstrap.yml</include>
     <include>**/*.xml</include>
     <include>**/*.sql</include>
   </includes>
</resource>

5.启动项目

2022-05-17 16:13:37.912||||[main] INFO  o.f.core.internal.database.base.DatabaseType 49 - Database: jdbc:mysql://localhost:3366/db (MySQL 5.7)
2022-05-17 16:13:37.999||||[main] INFO  org.flywaydb.core.internal.command.DbValidate 49 - Successfully validated 2 migrations (execution time 00:00.048s)
2022-05-17 16:13:38.025||||[main] INFO  org.flywaydb.core.internal.command.DbMigrate 49 - Current version of schema `db`: << Empty Schema >>
2022-05-17 16:13:38.039||||[main] INFO  org.flywaydb.core.internal.command.DbMigrate 49 - Migrating schema `db` to version "1.0.0 - create"
2022-05-17 16:13:38.123||||[main] INFO  org.flywaydb.core.internal.command.DbMigrate 49 - Migrating schema `db` to version "1.0.1 - insert"
2022-05-17 16:13:38.157||||[main] INFO  org.flywaydb.core.internal.command.DbMigrate 49 - Successfully applied 2 migrations to schema `db` (execution time 00:00.153s)

数据库中flyway记录历史信息表如下:
在这里插入图片描述
如果以上效果您已实现,那么恭喜您已经get到Flyway脚本管理器,good lucky!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值