关于java:Spring-Boot-集成-Flyway数据库也能做版本控制太牛逼了

51次阅读

共计 3978 个字符,预计需要花费 10 分钟才能阅读完成。

一、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 实战教程我都整顿好了。

本文演示环境:

  • JDK 1.8
  • Spring Boot 2.5.0
  • MySQL 8.0
  • IntelliJ IDEA 2021.1

这里仅展现 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<VERSION>__<NAME>.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__<NAME>.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/

最初,你们有应用 Flyway 或者相干工具吗?欢送分享应用教训~

感觉我的文章对你用播种的话,动动小手,给个在看、转发,原创不易,栈长须要你的激励。

版权申明:本文系公众号 “Java 技术栈 ” 原创,原创实属不易,转载、援用本文内容请注明出处,禁止剽窃、洗稿,请自重,尊重大家的劳动成果和知识产权,剽窃必究。

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0