当前位置: 首页 >文章 > Spring Boot 集成 Flyway,数据库也能做版本控制,太牛逼了!
收藏
分享

Spring Boot 集成 Flyway,数据库也能做版本控制,太牛逼了!

举报小虎转载君小虎转载君发布于 2021-08-05935阅读0点赞
一、Flyway 是什么?我们都知道,Git/ SVN 是代码界的版本控制工具,那么,Flyway 就是一款数据库界的版本控制工具,它可以记录数据库的变化记录。可能很多公司都是通过人工去维护、同步数据库脚本,但经常会遇到疏忽而遗漏的情况,举个简单的例子:我们在开发环境对某个表新增了一个字段,而提交测试时却忘了提交该 SQL 脚本,导致出现 bug 而测试中断,从而影响开发、测试的工作效率。有了 F...

一、Flyway 是什么?



我们都知道,Git/ SVN 是代码界的版本控制工具,那么,Flyway 就是一款数据库界的版本控制工具,它可以记录数据库的变化记录。

可能很多公司都是通过人工去维护、同步数据库脚本,但经常会遇到疏忽而遗漏的情况,举个简单的例子:

我们在开发环境对某个表新增了一个字段,而提交测试时却忘了提交该 SQL 脚本,导致出现 bug 而测试中断,从而影响开发、测试的工作效率。

有了 Flyway,我们可以按版本约定,统一管理所有的 SQL 脚本变更,在所有环境自动同步数据库,而无需人为手工控制,再也不用担心因数据库不同步而导致的各种环境问题。

官网:https://flywaydb.org/

支持的数据库:



支持的运行方式:



支持的 7 个命令:

  • Migrate(迁移)
  • Clean(清理所有配置的对象)
  • Info(显示迁移状态和细节)
  • Validate(验证迁移规则)
  • Undo(撤消最近的迁移)
  • Baseline(建立基线)
  • Repair(修复迁移历史表)

二、Spring Boot 集成 Flyway

Flyway 有社区开源免费版本和商业版本,本文以开源社区免费版,以及 Java API 的运行方式为示例进行演示下 Flyway Migrate 功能。

1、引入依赖

Flyway 几乎是零依赖,最低的要求是:

  • JDK 1.7+

  • Jdbc Driver

Spring Boot 基础教程就不介绍了,栈长之前写过很多,不会的关注公众号:Java技术栈,在后台回复:boot,历史 Spring Boot 实战教程我都整理好了。

本文演示环境:

这里仅展示 Spring Boot 之外的核心依赖:

<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-data-jdbc</artifactId>

    </dependency>

    <dependency>

        <groupId>mysql</groupId>

        <artifactId>mysql-connector-java</artifactId>

        <version>8.0.21</version>

    </dependency>

    <dependency>

        <groupId>org.flywaydb</groupId>

        <artifactId>flyway-core</artifactId>

        <version>7.10.0</version>

    </dependency>

</dependencies>

2、添加配置

Spring Boot 默认提供了对 Flyway 的自动配置:

org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration

所以,Spring Boot 项目,我们仅仅只要提供对应的配置参数即可:

spring:

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://localhost:3306/flyway

    username: flyway

    password: 12345678

  flyway:

    locations:

      - classpath:flyway

    table: t_flyway_history

版本注意:

Spring Boot 2.5 及以上版本,如果使用了 spring.flyway.url 进行定义,同时需要加上 username/ password 进行认证。

如果是第一次使用 Flyway,需要在 resources 目录下创建配置文件中指定的 Flyway 迁移目录:resources/flyway。

Flyway 也是约定大于配置的思想,以上 Flyway 的相关配置都可以不用写,可以说是零配置,它们都有默认值:

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

更多 Flyway 的参数配置可以参考这个类:

org.springframework.boot.autoconfigure.flyway.FlywayProperties

另外,最好是创建一套 Flyway 专门的数据库表和用户,和业务表、用户分开,权利最小化。

三、迁移实战

1、创建迁移脚本

然后在该目录下创建迁移脚本,迁移脚本文件命名规则是:

V__.sql

注意:版本号后面是两个下划线。

如栈长我第一次创建三个迁移脚本:

  • V1.0.0__create_javastack.sql
  • V1.0.1__insert_javastack.sql
  • V1.0.2__update_javastack.sql

首先创建一个表,然后插入几条记录,再更新记录,具体的 SQL 脚本内容就不贴上来了,完整的示例代码已提交 Github:

https://github.com/javastacks/spring-boot-best-practice

OK,Spring Boot 集成 Flyway 及相关的脚本都弄完了,可以说是不能再简单了,我们启动系统验证下脚本有没有执行。

1)首次启动

从启动日志可以看出,已经迁移了 3 个脚本,并且将当前版本更新到了 v1.0.2:



查看数据库,Flyway 历史表和业务表也都已经创建:



可以看出历史表记录了 3 个脚本的迁移详细记录,业务表的数据也已经插入并得到更新:



2)不修改再次启动

在不修改任何代码的情况下再次启动:



成功验证了 3 个迁移脚本,打印了当前的版本号,但并没有进行迁移,为什么?

因为这三个脚本都执行过迁移了,主要是版本号都小于等于当前版本号:1.0.2,所以不会进行迁移。

3)修改再次启动

我们再新增两个 SQL 脚本:

  • V1.0.3__alter_javastack.sql
  • V1.0.4__update_javastack.sql

首先新增两个字段:note 和 time,然后再进行对应的数据更新。

我们再次启动下:



成功迁移,当前版本来到了 v1.0.4。

查看数据库:

note 和 time 字段已经创建,并得到更新。

2、创建重复迁移脚本

从上面的例子我们知道,只要目录下的 SQL 脚本版本号大于当前版本号才会执行迁移,并且脚本都是一次性执行迁移的,如何做到可重复迁移呢?

Flyway 支持可重复迁移脚本,可重复迁移脚本文件命名规则是:

R__.sql

R(Repeated),即:可重复的。

这里我创建一个更新 note 和 time 字段的迁移脚本:

  • R__update_javastack.sql
1)首次启动

我们再次启动下:





从以上截图可以看到,重复迁移脚本也已经成功执行了。

2)不修改再次启动

如何确定能否重复执行迁移呢?

我们不修改任何代码再次启动下:



显示没有迁移的必要!!

那是因为我们没有对重复迁移脚本做任何的修改,所以系统不会迁移!

3)修改再次启动

我们再次改下脚本,把 note 后面加一个 ok,再次启动下:





脚本经过修改后再次迁移成功了,说明可重复迁移脚本也需要经过改动才能再次进行迁移,Flyway 会进行脚本对比。

最后贴一下迁移脚本目录:



这里我放到一个目录进行演示,实际开发中可以放到多个目录中区分维护。

四、迁移流程

OK,我们来梳理下迁移流程:

1)Flyway 会扫描配置的脚本目录下的脚本文件;

2)如果历史记录表不存在,则新建历史记录表;

3)如果是一次性执行脚本(V),按版本号从小到大执行迁移脚本,与当前历史表中的版本号做对比,大于当前版本号的脚本才会被执行迁移;

4)如果是可重复执行脚本(R),检查脚本是否有变动,有变动的可重复脚本才会被执行迁移;

Flyway Migrate 迁移流程图:



来源官网

另外,我们也可以手动删除迁移历史表中的迁移记录,这样也可以达到让一次性脚本再次执行的目的,但不建议在生产环境上进行使用。

五、总结

使用 Flyway 可以很方便的处理数据库表结果、数据的版本迁移,使用简单、自动化,大大提高生产力,再也不需要手工在控制台进行,那样更容易出错或者遗漏,毕竟人都是会经常犯错的。

本文使用的是 Java API 的方式,在项目启动时进行迁移,另外还有其他 3 种方式,文前有介绍,大家根据实际需要进行应用。

本文只是抛砖引玉,只介绍了 Flyway 中的 Migrate(迁移)环节,也是 Flyway 最主要的环节,另外还有其他 6 个环节,后续栈长在时间再进行分享,请陆续关注公众号Java技术栈,公众号第一时间推送。

本文完整示例代码已上传 Github:

https://github.com/javastacks/spring-boot-best-practice

更多细节可以参考官方文档:

https://flywaydb.org/documentation/




本文原创,未经作者允许不可转载!
更多内容,欢迎关注作者微信公众号: Java技术栈


0条评论
别默默看啦~登录/注册一起参与讨论吧~

暂无评论

请选择举报理由

违反法律法规

侵犯个人权益

有害网站环境

更多训练营>>

为你推荐 · 训练营(全勤打卡报名费全额返累计全额返用户133,707人)

【5月】零基础动态表情包创作训练营
距离开班仅剩6天39人已报名
【5月】7天轻松入门C4D小练习
距离开班仅剩10天15人已报名
【6月】7天轻松入门C4D小练习
距离开班仅剩31天0人已报名
特惠
充值
7折购
今日还在继续学习的你,太棒了!
7
折扣券可用于
年费无限VIP
立 即
使 用
此活动优惠不可与其他活动叠加使用
有效期:000000
消息
登录即可查看消息记录
建议
意见
官方
客服
在线咨询客服热线

您可以与在线客服进行沟通获得帮助

工作日:9:00~22:00节假日:9:00~18:00

联系在线客服

您可以电话联系客服进行沟通获得帮助

工作日:9:30~18:30

400-862-9191
虎课
积分
免费学习90000+个教程!
配套素材、源文件一键下载!
昨日学员已学习了34,407
并提交了214份作业!
登录后立即学习!
loading
微信扫码关注即可登录
您需要同意协议才可以进行登录
登录虎课网,每天免费学课程全站 90000+ 视频会员教程 | 每日可免费学 1
为确保账户信息安全
请先进行真实姓名验证后进行充值付款
立即验证