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


猜你喜欢
- 加密配置文件的SQL账号密码一般项目的配置文件里的信息都是明文的,导致有时候比较敏感的信息也直接暴露得超级明显,比如SQL的链接 账号 密码
- 一、通过Java代码在setContentView之前执行:requestWindowFeature(Window.FEATURE_NO_T
- 前言:因为项目中显示图片是用Picasso,设置placeholder和error图片的时候发现,本地图片的大小无法满足我的需求,需要先对图
- 在实施接口中,我们利用interface语法,将interface从类定义中独立出来,构成一个主体。interface为类提供了接口规范。在
- java.lang.OutOfMemoryError处理错误java.lang.OutOfMemoryError异常解决方法原因: 常见的有
- 关闭 IDEA 的自动检查更新(截图idea 2020 2.x)idea 右下角会有这样的更新提示2. 关闭 idea 自动检查更新取消勾选
- Java中的final关键字1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修
- 身为一名开发人员,大家都知道,我们经常会在项目中大量的编写许多重复的代码,比如说public Entity find(String id);
- 引言:上一专题介绍了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的介绍都是委托只是封装一
- 开发android的时候,尽管手机已经root但是DDMS中还是没有data/data路径怎么办?可以用cmd命令提示符为逐个文件夹设置权限
- C# Linq获取两个List或数组的差集交集List<int> list1 = newList<int>();li
- Android AsyncTask详解及使用方法 简介: AsyncTask就是一个封装过的后
- PathVariable 映射 URL 绑定的占位符带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向
- 本文介绍spring中自定义缓存resolver,通过自定义resolver,可以在spring的cache注解中增加附加处理。一、概述ca
- 函数四个方面:函数的定义函数的特点函数的应用函数的重载一、函数的定义及特点1) 什么是函数?函数就是定义在类中的具有特定功能的一段独立小程序
- 废话不多说了额,直接给大家贴代码了,具体代码如下所示:/** * 下载指定路径的文件,并写入到指定的位置 * &
- 背景之前在网上发现这个问题public class GenericTest { //方法一 public static <T exte
- 定义:"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式。好处:Lambda简化了匿名委托的使用
- 背景笔者使用 Spring Security 5.8 时,发现网上很多教程所教的 Spring Security 配置类 SecurityC
- 1.线程与进程进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是一个实体,一个进程中至少有一个线程,是CPU