Spring Boot项目使用Flyway的详细教程
作者:dreamingodd 时间:2021-12-19 12:05:58
Purpose
开发人员在合作的时候经常遇到以下场景:
1.开发人员A在自己的本地数据库做了一些表结构的改动,并根据这些改动调整了DAO层的代码,然后将代码上传到svn或git等版本控制服务器上。此时如果开发人员B拉取了A的代码改动,在运行项目的时候很可能会报错,因为B的本地SQL数据库并没有修改。
2.在项目上线的时候,当服务器拉取的版本控制服务器的最新修改后,必须同时运行SQL数据库的修改脚本,如果忘了跑数据库脚本,那么会出现严重的问题。
传统的解决方案就是在一个固定的文件夹中,将需要跑的SQL脚本放在里面。开发人员在合作的时候,A修改了数据库,在B遇到问题的时候,可能需要交流沟通一下,去跑需要的脚本。在项目上线的过程中,也是运维人员在规定的文件夹中,找到需要跑的SQL脚本。运行它们。
Flyway等migration工具就是要把开发人员和运维人员从以上这些场景的繁琐工作中解放出来,如果使用maven的话,那么在项目编译(SpringBoot运行Application)的时候,SQL数据库的改动就自动进入数据库,只要启动成功,开发或者运维人员对SQL数据库的migrate过程是无感知的,项目依然可以照常运行。
Technical Background
To read and practice this document, user ought to be able to develop projects via git, SpringBoot and MySQL.
Instructions - Run Demo
1.下载demo源码:
git clone https://git.oschina.net/dreamingodd/spring-boot-flyway-demo.git
2.使用Intellij或Eclipse import existing maven project。
3.在本地mysql console中运行:
create database flyway_test;
use flyway_test;
4.修改配置文件,将username和password改成本地MySQL数据库的。
5.运行FlywayTestApplication类。
6.在mysql console中运行
show tables;
即可看到以下结果:
(schema_version表保存了数据库版本信息,哪些脚本已经被执行,先不用管)
7.一张demo表被自动创建出来了。
What Happened
以上过程是如何实现的呢?
Flyway在maven项目编译(SpringBoot运行Application)的时候,自动扫描resources/db/migration目录下的文件,
打开V1_demo.sql:
就是刚刚自动运行的SQL脚本。添加脚本的话,依次使用V2__XXX.sql,V3__XXX.sql,以此类推,脚本中使用正常的SQL语句即可,没有任何学习负担。
这样,在开发人员合作以及项目部署的时候,Flyway就起到了加强自动化部署、实践持续交付等作用。
Instruction - Use in Current Project
那么如何在已经开发了一段时间的项目中使用Flyway呢?
1.Maven配置
<dependencies>中加上
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>4.0.3</version>
</dependency>
<build>中加上
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>4.0.3</version>
</plugin>
2.application.properties配置
flyway.baselineOnMigrate=true
如果是application.yml,则为
flyway.baselineOnMigrate: true
3.在resources/db/migration中添加V1__XXX.sql,mvn compile(运行Application)即可看到SQL脚本运行结果。(注意V1后面是两个下划线)
Appendix
1.出现错误的解决方法:
如果你的SQL脚本运行失败,到schema_version表中删除最新一条数据,
比如我故意写一个错误的SQL语句到V2__demo2.sql,运行mvn compile(运行Application)。
可以看到最新一条的success列为false。
如果部分成功了,要手动rollback,修改SQL脚本正确后再次mvn compile(运行Application)。
2.更多信息请访问官网:https://flywaydb.org/
来源:https://www.cnblogs.com/dreamingodd/p/6125435.html
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
SpringMVC 向jsp页面传递数据库读取到的值方法
java中Hibernate缓存形式总结
Flutter实现矩形取色器的封装
![](https://img.aspxhome.com/file/2023/9/96009_0s.jpg)
MyBatis字段名和属性名不一致的解决方法
JAVA中数组从小到大排序的2种方法实例
详解spring boot配置单点登录
java 反射机制详解及实例代码
SprintBoot深入浅出讲解场景启动器Starter
![](https://img.aspxhome.com/file/2023/9/59419_0s.png)
Java单例模式分析
Java monitor机制使用方法解析
![](https://img.aspxhome.com/file/2023/3/58563_0s.png)
SpringBoot如何进行对象复制的实践
![](https://img.aspxhome.com/file/2023/5/59935_0s.jpg)
java 使用idea将工程打成jar并创建成exe文件类型执行的方法详解
![](https://img.aspxhome.com/file/2023/2/60702_0s.png)
SpringBoot项目中如何访问HTML页面
![](https://img.aspxhome.com/file/2023/1/64421_0s.jpg)
java反射遍历实体类属性和类型,并赋值和获取值的简单方法
JavaWeb开发之使用jQuery与Ajax实现动态联级菜单效果
![](https://img.aspxhome.com/file/2023/6/60466_0s.png)
Java经典算法汇总之选择排序(SelectionSort)
![](https://img.aspxhome.com/file/2023/3/60343_0s.png)
java IO流 之 输出流 OutputString()的使用
Java编写迷宫小游戏
![](https://img.aspxhome.com/file/2023/5/62975_0s.jpg)