Spring Boot 3.0 : 集成flyway数据库版本控制工具

目录

个人主页: 【⭐️个人主页】

需要您的【💖 点赞+关注】支持 💯


Spring Boot 3.0 : 集成flyway数据库版本控制工具

📖 本文核心知识点:

  • flyway是什么
  • 为什么使用flyway
  • flyway如何使用
  • spring boot 集成实现

flyway是什么

https://flywaydb.org/

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

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

为什么使用flyway

主要特性

  • 普通 SQL:纯 SQL 脚本(包括占位符替换)没有专有的XML格式,没有锁定
  • 无限制:使用 Java 代码来进行一些高级数据操作
  • 零依赖:只需运行在 Java6(及以上)和数据库所需的 JDBC 驱动
  • 约定优于配置:迁移时,自动查找系统文件和类路径中的 SQL 文件或 Java 类
  • 高可靠性:在集群环境下进行数据库升级是安全可靠的
  • 云支持:完全支持 Microsoft SQL Azure, Google Cloud SQL & App Engine、Heroku Postgres 和 Amazon RDS
  • 自动迁移:使用 Flyway 提供的 API,让应用启动和迁移同时工作
  • 快速失败:损坏的数据库或失败的迁移可以防止应用程序启动
  • 数据库清理:在一个数据库中删除所有的表、视图、触发器,而不是删除数据库本身

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

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

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

支持的数据库:

flyway如何使用

支持的 7 个命令:

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

spring boot 集成实现

工具 版本
spring boot 3.1.5
flyway 10.0.1
jdk 17
mysql 8+

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

JDK 1.7+

Jdbc Driver

引入依赖

groovy 复制代码
   implementation 'org.flywaydb:flyway-core:10.0.1'
xml 复制代码
   <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
        <version>10.0.1</version>
    </dependency>

配置

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

org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration


application.yaml配置

yaml 复制代码
spring:
  flyway:
    enabled: true
    # 禁止清理数据库表
    clean-disabled: true
    # 如果数据库不是空表,需要设置成 true,否则启动报错
    baseline-on-migrate: true
    # 与 baseline-on-migrate: true 搭配使用
    baseline-version: 0
    locations: 
      - classpath:db/migration/mysql #(根据个人情况设置)
 

将需数据迁移的 sql 文件放置到 db/migration/mysql 目录中,启动 Spring Boot 项目即可运行 Flyway 进行数据迁移。

注意事项:

如果 flyway 不是项目初期引入,而是在数据库已有表的情况下引入时必须设置 baseline-on-migrate: true,设置该配置启动项目后,flyway 就会在数据库中创建flyway_schema_history表,并且会往该表中插入一条 version = 1 的建表记录,如果迁移数据有 V1__ 开头的文件,扫描文件会忽略该文件不执行迁移,进而可能引发其他迁移数据出错的问题。

sql版本控制约定

Flyway不限定脚本里面的内容,但是对脚本文件的名称有一定的要求,基于约定由于配置的原则,不同的类型通过文件命名方式进行区分

3种版本类型
  1. 版本迁移(Versioned Migrations)以V开头,只会执行一次;
  2. 回退迁移(Undo Migrations)以U开头,执行一旦发生破坏性更改,就会很麻烦,项目中一般不用;可重复执行迁移(Repeatable Migrations)以R开头,每次修改后都会重新执行。
  3. 可重复运行的SQL,则以大写的"R"开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。比如,RaddTable.sql,Rupdate_user.sql。

版本号需要唯一,否则Flyway执行会报错;如果V__脚本.sql,已经执行过了,不能修改里面的内容,再次执行Flyway就会报错。R------脚本.sql,如有变化可以执行多次。

V开头的SQL执行优先级要比R开头的SQL优先级高。

运行Spring

Flyway 8.2.1及以后版本不再支持MySQL?

官方Flyway 8.2.1版本发布说明(https://flywaydb.org/documentation/learnmore/releaseNotes#8.2.1),如下图所示

从说明上可知,MySQL代码被提取出来作为插件,需要另外增加依赖,根据官方文档(https://flywaydb.org/documentation/database/mysql)的说明,解决方案如下:

xml 复制代码
<dependency>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-mysql</artifactId>
</dependency>
相关推荐
逃逸线LOF29 分钟前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
幽灵诶33 分钟前
Mysql(基于测试的学习)
数据库·mysql
砚底藏山河39 分钟前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
慢云智慧空间42 分钟前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu1 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
宇宙无敌暴龙战士6661 小时前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
猿究院_夏燊1 小时前
MySQL 的四种隔离级别
java·数据库·mysql
薛定谔的猫-菜鸟程序员1 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
say_fall2 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
云创智城-yuncitys2 小时前
YunParking 4.0:JDK 17 与 Spring Boot 3.2 的停车云升级
java·开发语言·spring boot