SpringBoot中集成Flyway实现数据库sql版本管理入门以及遇到的那些坑

场景

Git/ SVN 是代码界的版本控制工具,那么,Flyway 就是一款数据库界的版本控制工具,

它可以记录数据库的变化记录。可能很多公司都是通过人工去维护、同步数据库脚本,

但经常会遇到疏忽而遗漏的情况,举个简单的例子:

我们在开发环境对某个表新增了一个字段,而提交测试时却忘了提交该 SQL 脚本,导致出现 bug 而测试中断,

从而影响开发、测试的工作效率。有了 Flyway,我们可以按版本约定,统一管理所有的 SQL 脚本变更,

在所有环境自动同步数据库,而无需人为手工控制,再也不用担心因数据库不同步而导致的各种环境问题。

官网:Homepage - Flyway

下面记录在SpringBoot项目中集成Flyway的过程。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

1、首先搭建SpringBoot项目并配置连接Mysql的依赖和配置文件,然后pom文件中添加flyway的依赖

        <!-- flyway sql版本管理 --><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>7.10.0</version></dependency>

只需添加以上依赖即可,这里示例的完整依赖为

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--MySQL驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--MyBatis整合SpringBoot框架的起步依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.1</version></dependency><!-- flyway sql版本管理 --><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>7.10.0</version></dependency></dependencies>

2、然后在yml中添加flyway的相关配置

放在spring节点下

配置的内容为

  flyway:#是否启用enabled: true# 可以支持多个location, 用','隔开locations: classpath:db/migration# 是否允许无序的迁移,默认falseout-of-order: false# 是否创建元数据表validate-on-migrate: true# flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这个默认值是false 理论上作为默认配置是不科学的clean-disabled: true# 如果数据库不是空表,需要设置成 true,否则启动报错baseline-on-migrate: true# 版本控制日志表,默认flyway_schema_history,不同系统建议修改数据# table: flyway_schema_history

3、上面配置的locations即为sql文件的存放位置,这里也是默认位置,可自由配置。

这里的脚本sql的命名规则是

V + 版本号(版本号的数字间以”.“或”_“分隔开) + 双下划线(用来分隔版本号和描述) + 文件描述 + 后缀名

注意这里的双下划线来分割版本号和文件描述。

示例:

V20230710_1__init.sql

比如这里初始化数据库的sql这样命名,代表执行初始化数据的操作,比如建表或插入基础数据等。

可以在Navicat等客户端软件中直接将基础库导出为sql并重命名。

将上面的sql放到resource目录下新建的db目录下的migration目录下

 

4、先执行初始化基础库的sql,这里启动项目如果没有报错并能看到以下执行成功的提示

此时查看数据库,会新建表flyway_schema_history表,这是版本记录表。

并且验证init的sql文件已经执行成功。

假如我们要修改其中某个表,比如给user表添加一个字段。

首先通过Navicat等软件修改本地表添加字段

在Navicat中修改表字段可以直接在SQL预览中看到执行操作的sql。

比如这里新增address字段的SQL预览为

ALTER TABLE `test`.`user`ADD COLUMN `address` varchar(255) NULL AFTER `pass`;

再新建V20230710_2__add_address_to_user.sql文件,将上面的sql内容复制进来。

此时代表版本2的更改。

重启项目,查看日志,当前版本执行到2

并且历史记录包中记录也新增

本地将address字段删除后,重启项目后会发现会执行版本2的添加字段的操作。

5、遇到的坑

SpringBoot中集成Flyway启动时提示:

Flyway failed to initialize: none of the following migration scripts locations could be found:

仔细核对配置与目录均正确。

报错是因为在IDEA新建目录时直接使用db.migration创建,会被认定为一个目录,

应该在resource下先新建db再在db下新建migration目录。

另外要注意如果发现目录下的sql没有执行,一定要注意sql文件的命名格式,尤其是使用双下划线来区分版本号和描述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/17535.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汽车EBSE测试流程分析(三):通过系统调研确定改进方案

EBSE专题连载共分为“五个”篇章。此文为该连载系列的“第三”篇章&#xff0c;在之前的“篇章&#xff08;二&#xff09;”中已经分析了EBSE步骤一&#xff1a;关于优势和挑战的案例研究。在本篇章&#xff08;三&#xff09;中&#xff0c;我们将结合具体研究实践&#xff0…

OpenCV创建一张类型为CV_8UC3的3通道彩色图像

#include <iostream> #include <opencv2/imgcodecs.hpp> #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp>int

Ubuntu Linux系统下创建Git项目并push到远程Github

首先在本地创建git仓库 jasminelhl:~/prj$ mkdir Github-test jasminelhl:~/prj$ cd Github-test jasminelhl:~/prj/Github-test$ git init 提示&#xff1a;使用 master 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中 提示&#xff1a;配置使用初始分支名&a…

【C++】VSCode 使用 C/C++ Compile Run 插件时,设置默认运行的编译参数的方法

为什么要设置参数 最近在学习C&#xff0c;在学习多线程的时候&#xff0c;发现使用C11中的thread类写的代码编译会报错&#xff1a; * 正在执行任务: g -Wall -Wextra -g3 /Users/anweiyang/studySrc/C/ThreadTest.cpp -o /Users/anweiyang/studySrc/C/output/ThreadTest /U…

Jmeter接口关联(一)【使用json层级方式提取值】与python中使用层级方式提取值 完成接口关联

文章目录 前言一、按照 json 的路径来提取 ​​​​​​​&#xff08;1&#xff09;成功匹配到数据的案例&#xff08;按照层级匹配&#xff09;&#xff08;2&#xff09;失败未匹配到数据的案例&#xff08;没有按照层级匹配&#xff09;json提取器二、使用完整的接口关联&a…

Django框架-11

聚合查询 1.聚合函数 使用aggregate()过滤器调用聚合函数。聚合函数包括&#xff1a;Avg 平均&#xff0c;Count 数量&#xff0c;Max 最大&#xff0c;Min 最 小&#xff0c;Sum 求和&#xff0c;被定义在django.db.models中。 例&#xff1a;查询图书的总阅读量。 from mo…

前端全集Ⅰ---- HTML/CSS/JavaScript

一 介绍web开发 Web&#xff1a;全球广域网&#xff0c;也称万维网&#xff0c;能够通过浏览器访问的网站 Web网站的工作流程&#xff1a;&#xff08;前后端分离模式&#xff09; 网页有哪些组成&#xff1f; 文字、图片、视频、音频、超链接 前端代码通过浏览器的解析和渲…

导入Excel数据【EasyPoi实战系列】- 第480篇

历史文章&#xff08;文章累计480&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 【…

docker 安装zookeeper单机版

1. 安装版本3.5.7, 也可以自己去官网找到自己需要的版本复制命令即可 https://hub.docker.com/_/zookeeper/tags docker pull zookeeper:3.5.7 2. 创建映射文件夹&#xff1a; #1. 在centos中创建三个文件夹 mkdir -p /home/zookeeper/conf mkdir -p /home/zookeeper/data mkd…

Redis事务

reids事务是指将多条命令放在一个队列当中&#xff0c;保证多个命令在同一个事务中执行而不受其他客户端的影响。 mutil 表示开启事务 命令1 命令2 命令3 exec 表示执行事务 redis的事务中不会保证原子性&#xff0c;假如命令3有误&#xff0c;并不会影响命令1和命令2的执行…

Linux信号机制-2

转自&#xff1a;Linux信号处理_linux 信号处理函数_努力啃C语言的小李的博客-CSDN博客 什么是信号 信号本质上是在软件层次上对中断机制的一种模拟&#xff0c;其主要有以下几种来源&#xff1a; 程序错误&#xff1a;除零&#xff0c;非法内存访问等。 外部信号&#xff1a…

Mybatis从0到1 SQL注入 参数占位符 XML配置 动态SQL

1. Mybatis基础操作 学习完mybatis入门后&#xff0c;我们继续学习mybatis基础操作。 1.1 需求 需求说明&#xff1a; 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求&#xff0c;完成员工管理的需求开发。 通过分析以上的页面原型和需求&#xff0c;我们确定了功能…