flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

0. 引言

在开发周期较长,或者需求变更频繁,涉及多版本发布的项目中,我们常常遇到这样的问题:

  • 改了表结构,开发环境执行了,忘记保存,发测试、生产环境时又要重写一遍DDL
  • 多人开发,都改了表结构,无法自动更新到自己的本地库
  • 新环境部署,之前改过的表结构,又要再改一遍

以上这些问题我们都统称为数据库表结构版本管理,实际开发中不止是代码需要版本管理,我们的数据库同样需要版本管理,良好的版本管理,才能让我们了解数据库的迭代变化,更加灵活的应对多环境部署。

在同事的推荐下,了解到了flyway这款工具,今天同样给大家分享下他的使用

1. flyway简介

flyway是一款基于java开发的,数据库移植组件,支持所有的JDBC数据库

源码地址:https://github.com/flyway/flyway

官方文档:https://flywaydb.org/documentation/getstarted/

flyway会在项目启动时,扫描指定路径下的所有sql脚本,同时会维护一张记录表flyway_schema_history,将扫描的sql脚本与flyway_schema_history中的记录对比,如果记录与指定路径下的sql脚本不一致(修改了历史的sql脚本),则会进行报错;

如果比对一致,则会执行记录中没有的sql脚本。

2. 使用

1、首先引入依赖,因为要连接数据库,所以还需要添加数据库驱动,这里以mysql为例

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

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
            <scope>runtime</scope>
        </dependency>

2、修改配置文件application.properties

spring:
  # 数据库连接配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/user_test?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
  flyway:
    # 是否启用,默认为true
    enabled: true
    # 编码格式,默认UTF-8
    encoding: UTF-8
    # sql脚本存放路径,默认db/migration
    locations: classpath:db/migration
    # sql脚本文件名前缀,默认V
    sql-migration-prefix: V
    # sql脚本文件名分隔符,默认双下划线__
    sql-migration-separator: __
    # sql脚本文件名称的后缀,默认.sql
    sql-migration-suffixes: .sql
    # 迁移时是否进行校验,确保历史脚本未篡改,默认true
    validate-on-migrate: true
    # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
    baseline-on-migrate: true

如上所示,如果我们都采用默认配置的话,实际上是不需要再声明配置了,只需要引入依赖即可。

3、根据上述配置,我们在src/main/resources/db/migration下,创建需要更新的sql脚本,注意脚本命名方式与上述配置的保持一致

这里我们创建一个V20230402__create_flyway_table.sql脚本:

CREATE TABLE `user_test`.`flyway`  (
  `id` int NULL,
  `name` varchar(255) NULL COMMENT '名称'
);
insert into `user_test`.`flyway` (id, name) values (1, '测试数据1');
insert into `user_test`.`flyway` (id, name) values (2, '测试数据2');

在这里插入图片描述

这里需要注意,如果是只执行一次的脚本,则以V命名开头,如果是需要每次都执行的脚本则可以以R命名开头,但这种情况一般很少用,另外还有以U开头的,用于回滚

官方详解
在这里插入图片描述

4、这里有一个需要注意的事项,这里直接启动会发现不会加载sql脚本,需要再引入mybatis-plus最新版的依赖,估计是flyway和mysql本身的适配问题。

注意一定要是新版,截止文章时最新为3.5.3.1,供大家参考

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
</dependency>

5、启动项目前查看数据库,是没有对应的表的

在这里插入图片描述

6、启动项目,成功生效后可以看到日志

在这里插入图片描述

7、再查看数据库,可以看到新加的表和flyway记录表都添加上了

在这里插入图片描述

sql脚本中的insert语句也执行成功

在这里插入图片描述

总结

综上,使用flyway来做多版本的数据库结构管理,是比较方便和快捷的,去尝试下吧

项目源码:
https://gitee.com/wuhanxue/wu_study/tree/master/demo/flyway_demo

猜你喜欢

转载自blog.csdn.net/qq_24950043/article/details/129905881