当前位置: 首页 > news >正文

SpringBoot + Flyway 发版再也不怕忘执行 SQL了

为什么使用Flyway

最简单的一个项目是一个软件连接到一个数据库,但是大多数项目中我们不仅要处理我们开发环境的副本,还需要处理其他很多副本。例如:开发环境、测试环境、生产环境。想到数据库管理,我们立刻就能想到一系列问题

  • 如何快速收集执行脚本的清单

  • 执行的脚本总要人工执行,是否可以通过机器执行

  • 执行的脚本是否已经在数据库执行过

  • 执行的脚本是否全部在数据库中执行过

  • 执行的脚本如何回退

  • 如何初始化一个空数据库实例

Flyway是一款数据库版本控制管理工具,它可以简单的、可靠的升级你的数据库。它能帮助解决上面的问题。Flyway核心是记录所有版本演化和状态的MetaData,首次启动创建默认名为SCHEMA_VERSION的元素表。表中保存了版本,描述,要执行的sql脚本等信息。

Flyway已经支持数据库包括:Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL (including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL (including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoeni

官网链接:https://flywaydb.org/

SpringBoot集成Flyway

2.1 简单示例

参考版本信息

参考目录结构

1.创建SpringBoot应用,并添加flyway-core依赖,本例中将实现初始化脚本到mysql数据库,因此同时引入了驱动依赖mysql-connector-java

<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>7.15.0</version> </dependency>

参考pom.xml依赖如下

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>7.15.0</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> </dependencies>

2.在application.properties中设置flyway信息

server.port=7002 ##是否启动,默认开启 spring.flyway.enabled = true ##脚本存放路径 spring.flyway.locations = classpath:db/migration ##当flyway第一次运行时,会在我们对应的数据库中新建一个记录脚本运行情况的 spring.flyway.table=flyway_schema_history ## flyway指向的数据库链接 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/runoob?useUnicode=true&characterEncoding=utf8 ## 用户名 spring.flyway.user=nacos ## 密码 spring.flyway.password=nacos ## 数据库驱动 spring.flyway.driver-class-name=com.mysql.cj.jdbc.Driver

3.脚本整理

将脚本整理到resource/db.migration路径下,例如

参考SQL脚本信息如下

//V1.20190621.1854__CREATE_PERSION_TABLE.sql脚本内容 create table PERSON ( ID int not null, NAME varchar(100) not null ); //V1.20190621.1904__INIT_PERSION.sql 脚本内容 insert into PERSON (ID, NAME) values (1, 'Axel'); insert into PERSON (ID, NAME) values (2, 'Mr. Foo'); insert into PERSON (ID, NAME) values (3, 'Ms. Bar');

sql 目录中存放脚本文件,脚本名称命名方式

  • 版本化迁移:执行一遍,版本号唯一,有重复会报错: 格式:V+版本号 +双下划线+描述+结束符

  • 重复的迁移,不需要版本号,脚本发生变化启动就会执行:格式:R+双下划线+描述+结束符

  • 撤消迁移:格式:U+版本号 +双下划线+描述+结束符

4.运行启动主类,运行日志如下,从日志中可以看到如下信息

  • 启动后正确链接到数据库runoob

  • 验证2个迁移脚本成功

  • 使用命令行的方式创建了一张名称为flyway_schema_history的记录表,这里要注意,所有脚本一旦执行了就会在flyway_schema_history中创建记录, 如果出错引发问题,可以删除表中记录,反正启动的时候还会再执行,当然生产环境不建议此方法,但生产环境上部署的包都是验证过无问题的包也不会出现此问题

  • 执行了resource/db.migration目录下的两个脚本,并执行成功

INFO 190688 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 7.15.0 by Redgate INFO 190688 --- [ main] o.f.c.i.database.base.BaseDatabaseType : Database: jdbc:mysql://127.0.0.1:3306/runoob (MySQL 5.7) INFO 190688 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 2 migrations (execution time 00:00.016s) INFO 190688 --- [ main] o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table `runoob`.`flyway_schema_history` with baseline ... INFO 190688 --- [ main] o.f.core.internal.command.DbBaseline : Successfully baselined schema with version: 1 INFO 190688 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema `runoob`: 1 INFO 190688 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema `runoob` to version "1.20190621.1854 - CREATE PERSION TABLE" INFO 190688 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema `runoob` to version "1.20190621.1904 - INIT PERSION" INFO 190688 --- [ main] o.f.core.internal.command.DbMigrate : Successfully applied 2 migrations to schema `runoob`, now at version v1.20190621.1904 (execution time 00:00.225s)

停止服务后,重新运行日志如下,从日志中可以看到信息

  • 启动后正确链接到数据库runoob

  • 验证2个迁移脚本成功

  • 本次没有重复执行脚本, 日志中打印当前脚本编号20190621.1904, 即最后1次执行的脚本

INFO 193184 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 7.15.0 by Redgate INFO 193184 --- [ main] o.f.c.i.database.base.BaseDatabaseType : Database: jdbc:mysql://127.0.0.1:3306/runoob (MySQL 5.7) INFO 193184 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 3 migrations (execution time 00:00.024s) INFO 193184 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema `runoob`: 1.20190621.1904 INFO 193184 --- [ main] o.f.core.internal.command.DbMigrate : Schema `runoob` is up to date. No migration necessary.

查看Mysql数据库

2.2 常见问题

1.Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s)

Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s) `runoob` but no schema history table. Use baseline() or set baselineOnMigrate to true to initialize the schema history table. at org.flywaydb.core.Flyway$1.execute(Flyway.java:200) ~[flyway-core-7.15.0.jar:na] at org.flywaydb.core.Flyway$1.execute(Flyway.java:170) ~[flyway-core-7.15.0.jar:na] at org.flywaydb.core.Flyway.execute(Flyway.java:586) ~[flyway-core-7.15.0.jar:na]

问题原因:第一执行的时候没有找到schema history table,这张表其实就是application.properties文件中spring.flyway.table属性配置的表,因此要么使用命令创建一个或者在application.properties文件中设置spring.flyway.baseline-on-migrate=true

2.Caused by: org.flywaydb.core.api.FlywayException: Unsupported Database: MySQL 5.7

Caused by: org.flywaydb.core.api.FlywayException: Unsupported Database: MySQL 5.7 at org.flywaydb.core.internal.database.DatabaseTypeRegister.getDatabaseTypeForConnection(DatabaseTypeRegister.java:106) ~[flyway-core-8.4.2.jar:na] at org.flywaydb.core.internal.jdbc.JdbcConnectionFactory.<init>(JdbcConnectionFactory.java:75) ~[flyway-core-8.4.2.jar:na] at org.flywaydb.core.FlywayExecutor.execute(FlywayExecutor.java:143) ~[flyway-core-8.4.2.jar:na] at org.flywaydb.core.Flyway.migrate(Flyway.java:124) ~[flyway-core-8.4.2.jar:na]

问题原因:flyway-core对数据库版本有要求,例如flyway-core的当前最高版本V8.4.3,不能使用 MySQL 5.7, 当flyway-core降低到V7.15.0后 问题解决,所以匹配flyway-core和数据库版本后问题即可解决

2.3 源码参考

https://github.com/PNZBEIJINGL/springboot

总结

本文介绍了Springboot集成flyway方式

  • 使用Flyway之前部署脚本方式一般为开发人员按照顺序汇总数据库的升级脚, 然后DBA或者售后在生产库中按照顺序执行升级脚本。

  • 使用Flyway之后部署脚本方式就变更为开发人员将脚本构建到程序包中, 部署程序包后启动时Flyway自动执行脚本升级

http://www.jsqmd.com/news/362961/

相关文章:

  • 2026年三维医学动画制作优质机构推荐指南:污水治理动画制作/泵阀动画制作/物流仓储动画制作/电力设备动画制作/选择指南 - 优质品牌商家
  • 本地 LLM 实战基础教程(非常详细),手把手教你做文本情感分析!
  • 我们用过的 3种订单超时自动取消方案
  • Bootstrap 弹出框
  • 看看如何用 Redis实现微博好友(关注,取关,共同关注)
  • 2026年名包回收正规平台厂家最新推荐:百达翡丽名表回收电话、迪奥名包回收电话、香奈儿包包回收电话选择指南 - 优质品牌商家
  • 2/9
  • Spring Boot 3 步完成日志脱敏,简单实用~
  • 在windows7安装高版本Nodejs
  • 2026清水混凝土塑料模板优质推荐榜 - 优质品牌商家
  • 微信小程序 基于SpringBoot3的校园食堂点餐配送系统的设计与实现
  • Java毕设选题推荐:基于springboot的软件协作跟踪平台的设计与开发基于springboot的软件开发项目任务跟踪系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • ESP32简单介绍(包含与STM32、C51之间的联系) - 指南
  • 基于SSM框架城市生活e家平台 社区物业服务系统
  • 【课程设计/毕业设计】基于springboot的软件协作跟踪平台的设计与开发软件项目进度管理系统【附源码、数据库、万字文档】
  • 伺服系统三环控制这玩意儿就像给机器人装了个智能驾驶系统。今天咱们来聊聊怎么用现代控制算法让它跑得又稳又快,重点看看位置速度环复合控制这个核心玩法
  • 【程序员职业规划】没有实习经历,简历该怎么写?
  • Java计算机毕设之基于Java springboot软件协作跟踪平台系统项目申请进度变更基于springboot的软件协作跟踪平台的设计与开发(完整前后端代码+说明文档+LW,调试定制等)
  • 基于SSM框架的校园编程俱乐部管理系统的设计与实现
  • Agent Skills 检索全攻略(非常详细),颠覆你对传统 RAG 的认知!
  • 基于springboot的小说在线阅读平台 数据可视化 章节
  • 互联网大厂Java求职面试实战:Spring Boot微服务与消息队列在电商场景中的应用
  • 2026年名表回收公司权威推荐:卡地亚名表回收电话/名牌包回收电话/成都二手名包回收电话/成都名包上门回收电话/选择指南 - 优质品牌商家
  • 什么是裸金属服务器(Bare Metal Server)?
  • 谁说Win7安装不了Node.js最新版的呢?都2025年,还不更新系统到Win11
  • 大模型实战项目精选(非常详细),8个超硬核案例,收藏这一篇就够了!
  • 2026年入坑IT行业,程序员的编程语言如何正确选择!才能让自己立于不败之地?
  • 让Oracle 回收站,定时释放表空间,释放drop表(BIN$QVpggWU0FYfgYwsLbgrhcA==$0)空间
  • 2026年名包回收厂家权威推荐榜:成都品牌名表回收电话/成都奢侈品名表回收电话/成都高价奢侈品包包回收电话/选择指南 - 优质品牌商家
  • java juc 01 进程与线程