SpringBoot + Flyway,自动化实现数据库版本控制

为什么使用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/
基于 spring boot + mybatis plus + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/yunaiv/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/ springboot集成flyway 2.1 简单示例 参考版本信息
参考目录结构
1.创建springboot应用,并添加flyway-core依赖,本例中将实现初始化脚本到mysql数据库,因此同时引入了驱动依赖 mysql-connector-java
    org.flywaydb    flyway-core    7.15.0 参考pom.xml依赖如下
            org.springframework.boot        spring-boot-starter                org.springframework.boot        spring-boot-starter-test        test                org.springframework.boot        spring-boot-starter-jdbc                mysql        mysql-connector-java        8.0.28                org.flywaydb        flyway-core        7.15.0                org.junit.jupiter        junit-jupiter-api        5.8.2        test     2.在application.properties中设置flyway信息
server.port=7002##是否启动,默认开启spring.flyway.enabled = true##脚本存放路径spring.flyway.locations = classpath:db/migration##当flyway第一次运行时,会在我们对应的数据库中新建一个记录脚本运行情况的spring.flyway.table=flyway_schema_history> 基于 spring cloud alibaba + gateway + nacos + rocketmq + vue & element 实现的后台管理系统 + 用户小程序,支持 rbac 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能>> * 项目地址:> * 视频教程:# flyway指向的数据库链接spring.datasource.url=jdbc//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//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//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.(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方式


可燃气体报警器不同测定条件控制方式及测量
学会使用顶级算法的秘诀是什么?如何找到合适的学习率?
医疗领域的AI可以干什么
京东方亮相第五届数字中国建设成果展
影响工业无线遥控器遥控距离和信号强度值的因素
SpringBoot + Flyway,自动化实现数据库版本控制
区块链的标准化问题对于区块链技术与应用推广意义重大
怎样在LabVIEW中过滤加速度计噪声
常被忽略的九项ADC技术指标
电路设计中基于TL431制作2.5V参考电压的案例解析
推荐这四款好用的API测试工具
AI实现按键输入功能控制不同的LED灯
vivo抢到联发科天玑1100首发权,却重演低配高价
戴尔科技集团与 NVIDIA 联合发布用于安全、本地化部署生成式 AI 的 Project Helix
MWC上海丨紫光同芯邹重人在eSIM峰会上发表“一芯通全球”主题演讲
对于小米的自愿环保 米粉是怎么选的呢
遭受国产企业重击下的苹果选择印度,能否实现自己的梦想?
人工智能芯片设计的差距缩小 AI已经应用在各个领域
基于区块链的银行生态系统Moeda介绍
一起体验“信仰之跃”!电影《刺客信条》推VR版