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>
相关推荐
月光水岸New36 分钟前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山67537 分钟前
数据库基础1
数据库
我爱松子鱼41 分钟前
mysql之规则优化器RBO
数据库·mysql
闲猫43 分钟前
go orm GORM
开发语言·后端·golang
丁卯4041 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo1 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Tirzano2 小时前
springsecurity自定义认证
spring boot·spring
Rverdoser2 小时前
【SQL】多表查询案例
数据库·sql
Galeoto2 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql