0. 引言

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

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

以上这些问题咱们都统称为数据库表结构版别办理,实际开发中不止是代码需求版别办理,咱们的数据库相同需求版别办理,杰出的版别办理,才干让咱们了解数据库的迭代改变,愈加灵活的应对多环境布置。

在搭档的推荐下,了解到了flyway这款工具,今日相同给大家分享下他的运用

1. flyway简介

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

源码地址:github.com/flyway/flyw…

官方文档:flywaydb.org/documentati…

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');

flyway:如何优雅的管理数据库表结构历史版本

这儿需求留意,如果是只履行一次的脚本,则以V命名最初,如果是需求每次都履行的脚本则能够以R命名最初,但这种情况一般很少用,另外还有以U最初的,用于回滚

官方详解:

flyway:如何优雅的管理数据库表结构历史版本

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、启动项目前检查数据库,是没有对应的表的

flyway:如何优雅的管理数据库表结构历史版本

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

flyway:如何优雅的管理数据库表结构历史版本

7、再检查数据库,能够看到新加的表和flyway记载表都增加上了

flyway:如何优雅的管理数据库表结构历史版本

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

flyway:如何优雅的管理数据库表结构历史版本

总结

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

项目源码: gitee.com/wuhanxue/wu…