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

news2024/9/25 13:19:47

场景

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
    # 是否允许无序的迁移,默认false
    out-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.coloradmin.cn/o/738708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

glob找不到文件而os.listdir可以

前几天遇到了一个问题&#xff0c;就是glob找不到文件而os.listdir可以 /mnt/data/datasets/abc[123]&#xff1a; ├── img_0001.jpg ├──img_0002.jpg代码 import os import glob path /mnt/data/datasets/abc[123] os.listdir(path) glob.glob(os.path.join(path, *.…

ES6: Proxy概念及用法

Proxy如其名&#xff0c; 它的作用是在对象和和对象的属性值之间设置一个代理&#xff0c;获取该对象的值或者设置该对象的值&#xff0c; 以及实例化等等多种操作&#xff0c; 都会被拦截住&#xff0c; 经过这一层我们可以统一处理&#xff0c;我们可以认为它就是“代理器” …

使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?

# 问题原因 关于这个问题&#xff0c;其实答案相对统一&#xff0c;实际上用大白话说起来也容易理解。 1.初始化问题 先看一下Java初始化类的顺序&#xff1a;父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块…

前端学习——Web API (Day3)

事件流 事件流和两个阶段说明 事件捕获 事件冒泡 阻止冒泡 解绑事件 事件委托 案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" …

day1-搜索插入位置

搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: …

flutter开发实战-底部bottomNavigationBar➕PageView

flutter开发实战-底部bottomNavigationBar tabbar在app中非常常见&#xff0c;底部BottomNavigationBar属性 一、BottomNavigationBar属性 BottomNavigationBar组件的常用属性&#xff1a; type&#xff1a;tabbar样式&#xff0c;默认为白色不显示&#xff1b;fixedColor:t…

AR眼镜:可视化声音

推荐&#xff1a;将 NSDT场景编辑器加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 音频可以包括各种各样的声音&#xff0c;从人类语音到非语音声音&#xff0c;如狗吠和警笛声。在为有听力障碍的人设计可访问的应用程序时&#xff0c;应用程序应该能够识别声音并理…

【二分查找】面试题 08.03. 魔术索引

面试题 08.03. 魔术索引 解题思路 改写递归二分查找的思路首先查找mid的值是不是mid 如果是 由于有多个解&#xff0c;那么递归搜索左半边的空间然后如果没找到&#xff0c;首先搜索左半边的空间&#xff0c;然后搜索右半边的空间 class Solution {public int res -1;privat…

mybatis-plus案例报错

报错信息: Error creating bean with name ‘dataSource’ defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Generic.class]: Bean instantiation via factory method failed; nested exception is org.springframework…

ELK 企业级日志分析系统(一)

ELK 一、ELK理论日志管理方案为什么要使用ELK完整日志系统基本特征ELK 简介ELK 的工作流程 二、ELK实验ELK Elasticsearch 集群部署ELK Logstash 部署&#xff08;在 apche节点上操作&#xff09;ELK Kiabana 部署&#xff08;在 Node1 节点上操作) 一、ELK理论 日志管理方案 …

django对数据库中的表进行重新生成

删除数据库中的表删除项目中migrations包下的初始化文件 进入到manage.py目录下执行命令python manage.py makemigrations执行完上述命令之后&#xff0c;再执行命令python manage.py migrate就可以啦 关于详细的数据表生成见博文&#xff1a;https://blog.csdn.net/David_hou…

IO多路复用之select,poll,epoll

所以&#xff0c;我们调用 select 会把所有要管理的 socket 的 fd (文件描述符&#xff0c;Linux下皆为文件&#xff0c;简单理解就是通过 fd 能找到这个 socket)传到内核中。 此时&#xff0c;要遍历所有 socket&#xff0c;看看是否有感兴趣的事件发生。如果没有一个 socket…

Linux常见维护报错,修复MBR引导/修复grub2菜单/内核文件丢失

目录 一&#xff0c;修复MBR 1.模拟MBR损坏 2.重启查看系统 3.借助当前系统的光盘来进行修复 4.进入修复模式 进行修复 5.恢复正常 二&#xff0c;修复grub2菜单 1.出现情况 2.进入修复模式 3.进行修复grub2菜单 4.退出重启即可 三&#xff0c;内核文件丢失 1.进入安全模式 2.挂…

进销存软件哪个好?怎么选?(附模板)

已经把挑选进销存软件的几个注意点归纳的很到位了&#xff1a; 软件价格收费模式&#xff08;按年付费还是一次性买断&#xff09;功能要贴合本企业使用注重数据的准确性与安全性操作一定要简单要有良好的售后服务支持 在这几点的基础上&#xff0c;我简单说一下&#xff1a;…

运维开发面试题第四期(最后有数据库的题)

linux 如何查看当前linux系统的版本号&#xff08;uname -a 内核 cat /proc/version版本&#xff09;、系统状态《如CPU使用&#xff08;top - bn&#xff09;&#xff0c;内存使用情况&#xff08;vmstat,free-m&#xff09;》、如何查看监控磁盘 io负载&#xff08;iostat/ls…

Docker部署Mysql数据库详解

目录 1. Docker部署Mysql 1.1 Mysql容器 1.1.1 创建Mysql容器 1.1.2 进入Mysql容器并登录Mysql 1.1.3 持久化数据 1.2 远程登录Mysql 1.2.1 修改root加密方式 1.2.2 在容器启动时配置加密方式为mysql_native_password 1.3 Mysql编码 1.3.1 Mysql编码问题 1.3.2 Mysql编码…

虚函数是什么?虚函数是怎么实现的?什么时候用虚函数?

发现自己的笔记记录得四处都是&#xff0c;这些天统一整理汇总一下 1. 虚函数和多态的关系&#xff1a; 虚函数 往往 用于 实现 C的多态性 2. 什么是多态&#xff1a; &#xff08;1&#xff09;Wiki定义 &#xff1a; 指计算机程序运行时&#xff0c;相同的消息 发送给 多…

Acwing 848.有向图的拓扑序列

Acwing 848.有向图的拓扑序列 链接&#xff1a;848. 有向图的拓扑序列 - AcWing题库 /* 啥是拓扑排序? 首先要满足有向无环图的条件 一个有向图&#xff0c;如果图中有入度为 0 的点&#xff0c;就把这个点删掉&#xff0c;同时也删掉这个点所连的边。 一直进行上面出处理&am…

一个合格的测试人员需要具备迅速的反馈力

01 反馈指的是&#xff1a;在信息的传播中&#xff0c;接受者对传播者发出信息的反映。反馈得很重要一个属性就是时间滞延。在测试活动中&#xff0c;笔者经常会团队的测试人员一个问题&#xff1a;开发提交了一段代码后&#xff0c;多久能收到质量反馈&#xff1f;是按天&…

腾讯云轻量应用服务器性能测评一下,感觉还行吧

腾讯云轻量应用服务器性能如何&#xff1f;轻量服务器CPU内存带宽配置高&#xff0c;CPU采用什么型号主频多少&#xff1f;轻量应用服务器会不会比云服务器CVM性能差&#xff1f;腾讯云服务器网详解CPU型号主频、内存、公网带宽和系统盘存储多维对比&#xff0c;相对于CVM云服务…