Java 中Flyway的使用详解
作者:不敲代码的攻城狮 发布时间:2022-04-11 03:38:54
Flyway的使用
环境:SpringBoot 2.0.4.RELEASE
为什么要用Flyway?
开发人员在合作的时候经常遇到以下场景:
1.开发人员A在自己的本地数据库做了一些表结构的改动,并根据这些改动调整了DAO层的代码,然后将代码上传到svn或git等版本控制服务器上。此时如果开发人员B拉取了A的代码改动,在运行项目的时候很可能会报错,因为B的本地SQL数据库并没有修改。
2.在项目上线的时候,当服务器拉取的版本控制服务器的最新修改后,必须同时运行SQL数据库的修改脚本,如果忘了跑数据库脚本,那么会出现严重的问题。
传统的解决方案就是在一个固定的文件夹中,将需要跑的SQL脚本放在里面。开发人员在合作的时候,A修改了数据库,在B遇到问题的时候,可能需要交流沟通一下,去跑需要的脚本。在项目上线的过程中,也是运维人员在规定的文件夹中,找到需要跑的SQL脚本。运行它们。
Flyway等migration工具就是要把开发人员和运维人员从以上这些场景的繁琐工作中解放出来,如果使用maven的话,那么在项目编译(SpringBoot运行Application)的时候,SQL数据库的改动就自动进入数据库,只要启动成功,开发或者运维人员对SQL数据库的migrate过程是无感知的,项目依然可以照常运行。
Flyway是什么?
官方网站:https://flywaydb.org/
Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。
Flyway最核心的就是用于记录所有版本演化和状态的MetaData表,Flyway首次启动会创建默认名为SCHEMA_VERSION的元素局表。 表中保存了版本,描述,要执行的sql脚本等;
sql脚本的格式:V + 版本号 + 双下划线(__) + 描述 + 结束符(.sql)
例如:V1__INIT_DATABASE.sql
命令解释:
Migrate
Migrate 是指把数据 Schema 迁移到最新版本,在 Migrate 时会检查 MetaData 元数据表,如果不存在就创建 MetaData 表,MetaData 用于记录数据库历史变更等信息;
Migrate会扫描指定文件系统或者 classpath 下的 Migrations。会与 MetaData 中的记录进行对比,进行版本升级;
clean
清除掉对应数据库 Schema 中所有的对象,包括表结构,视图,存储过程等,clean 操作在 dev 和 test 阶段很好用;
info
用于打印所有的 Migrations 的详细和状态信息,也是通过 MetaData 和 Migrations 完成的,可以快速定位当前的数据库版本;
validate
验证以及apply的Migrations是否有变更,默认开启的;原理是对比MetaData表与本地Migrations的checkNum值,如果值相同则验证通过,否则失败
baseline
对已经存在数据库Schema结构的数据库一种解决方案。实现在非空数据库新建MetaData表,并把Migrations应用到该数据库;也可以应用到已有表结构的数据库中也可以实现添加Metadata表
repair
repair操作能够修复metaData表,该操作在metadata出现错误时很有用
用途:
1):移除失败的Migration记录,只针对不支持DDL事务的数据库
SpringBoot中使用Flyway管理数据库版本
一、添加maven依赖及插件
<!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-core -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.0.7</version>
</dependency>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
</plugin>
添加插件的目的是为了使用上面讲到的一些命令:如下图:
二、开启Flyway支持、配置Flyway
######################FlyWay#######################
# 在没有元数据表的情况下,针对非空Schema执行迁移时是否自动调用基线。 (默认值:false)
spring.flyway.baseline-on-migrate=true
# 下面几个配置不写也行,都是默认配置,这里写了是方便以后改
# 执行基线时用来标记已有Schema的版本。(默认值:1)
spring.flyway.baseline-version=1
spring.flyway.enabled=true
spring.flyway.sql-migration-prefix=V
spring.flyway.locations=classpath:db/migration
三、在resource目录下创建db/migration目录添加sql脚本
如图:
下面是 V1.0.0.20190509.0957__flyway_test.sql
脚本
use `spring_boot_building`;
DROP TABLE IF EXISTS `table1`;
CREATE TABLE `table1` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
spring_boot_building
是我的项目连接的数据库
四、验证是否成功
启动项目,看启动日志:
打开数据库管理工具,查看数据库:
五、SQL文件版本号命名的规范
每个公司的规范肯定不一样.开发时,只需要项目内遵循该规范即可,规范的确定并没有对错.提供一种sql文件命名规范仅供大家参考。
遇到的问题
因为我的项目数据库连接池使用的是Druid,在启动项目时发现报异常sql injection violation, part alway true condition not allow
,原因是Flyway通过 SQL 脚本来执行数据库的建立与更新。当同时集成了 Druid 和 Flyway 之后,Druid 的 wall 防火墙极可能直接干预 SQL 脚本的操作,继而导致 Flyway 执行中断。
网上教程是去掉wall防火墙配置,我试了确实可以,但是个人觉得这种做法不安全,应该还有其他的方法。
参考:
Spring Boot项目使用Flyway
Spring Boot中使用Flyway来管理数据库版本
SpringBoot项目集成Flyway进行数据库版本控制
Flyway详解以及Springboot集成Flyway
来源:https://blog.csdn.net/qq_34845394/article/details/90025456


猜你喜欢
- 本文实例讲述了Android编程开发ScrollView中ViewPager无法正常滑动问题解决方法。分享给大家供大家参考,具体如下:这里主
- 什么是二叉搜索树简单来说,就是方便搜索的二叉树,是一种具备特定结构的二叉树,即,对于节点n,其左子树的所有节点的值都小于等于其值,其右子树的
- 本文介绍了Android 删除所有build编译文件,翻译磁盘空间,分享给大家,也给自己留个笔记,具体如下: public static v
- 目录1、备份原数据库File文件2、数据库升级XML编写 updateXml.xml3、创建XML解析器3.1 对应工具类 DomUtils
- 归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序
- 1.相关介绍@Conditional注解可以用在任何类型或者方法上面,通过@Conditional注解可以配置一些条件判断,当所有条件都满足
- 引语:工作中有时候需要在普通的对象中去调用spring管理的对象,但是在普通的java对象直接使用@Autowired或者@Resource
- 很多方法请看官网地址:hutool官网地址脚本之家下载:https://www.jb51.net/softs/549331.html简介Hu
- 本文实例为大家分享了Android实现闪光灯效果的具体代码,供大家参考,具体内容如下一、声明闪光灯的权限<uses-permissio
- 引言♀ 小AD:明哥,我终于出了这口恶气了。♂ 明世隐:打爽了是吧。♀ 小AD:那必须的,打十盘我赢九盘,我随意。♂ 明世隐:那小朋友不是搞
- 在实际项目当中,我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年。。。。某些网站会记录下用
- 目录问题产生如何解决总结问题产生默认生成的flutter工程,在启动时候会白屏,设备性能越差,白屏时间越长。原生Android开发也会遇到类
- yml文件参数的读取附上一个较为常见的application.yml文件示例server: port: 9999 u
- 前言之前写过 Mybatis Plus 的基本配置和使用。Mybatis-Plus 看这一篇就够了当初在进行查询时,虽然没有写硬SQL进行查
- 在Android应用中,图片裁剪也是一个经常用到的功能。Android系统中可以用隐式意图调用系统应用进行裁剪,但是这样做在不同的手机可能表
- Spring Security 过滤器链及自定义Filter别名类名称Namespace Element or AttributeCHANN
- Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。为什么使用共享模式/享元模式面向对象语言的
- 我们经常在项目中使用的线程池,但是是否关心过线程池的关闭呢,可能很多时候直接再项目中直接创建线程池让它一直运行当任务执行结束不在需要了也不去
- 简介我们知道在native的代码中有很多指针,这些指针在JNA中被映射成为Pointer。除了Pointer之外,JNA还提供了更加强大的M
- 1、try with catch还记得这样的代码吗?我们需要手动的关闭资源的流,不然会造成资源泄漏,因为虚拟机无法管理系统资源的关闭,必须手