当前位置: 首页 > news >正文

spring boot整合flyway实现数据的动态维护

1、简单介绍一下flyway

Flyway 是一款开源的数据库版本控制工具,主要用于管理数据库结构的变更(如创建表、修改字段、插入数据等)。它通过跟踪和执行版本化的迁移脚本,帮助团队实现数据库变更的自动化。接下来简单介绍一下flyway的工作流程:

1.1、 初始化阶段

  • 检查元数据表
    Flyway 首先检查目标数据库中是否存在 flyway_schema_history 表(默认表名称,也可以自定义历史表名称)。

    • 不存在:自动创建该表,用于记录迁移历史

    • 已存在:读取已有迁移记录

千万不要手动的修改历史表的任何数据,不然肯定会导致版本管理错误。

1.2、 迁移扫描

  • 脚本加载
    扫描配置的 locations 路径(默认 classpath:db/migration),识别两类脚本:

    • 版本化迁移脚本V 开头)

    • 可重复迁移脚本R 开头)

1.3、校验阶段

  • 校验 Checksum
    对比已执行脚本的 checksum 与本地文件的 checksum

    • 若已执行脚本的 checksum 发生变化 → 抛出错误(防止篡改历史脚本)

    • 校验通过 → 进入迁移阶段

1.4、 迁移执行

  • 版本化迁移
    按版本号顺序执行所有 未应用 的 V 前缀脚本,且 仅执行一次

  • 可重复迁移
    按文件名顺序执行 R 前缀脚本,当脚本内容变化时 重新执行

1.5、 更新元数据

每个成功执行的脚本会被记录到 flyway_schema_history 表,包含:

版本号

脚本名称

checksum

执行时间

执行状态

如图就是一个默认的历史表中数据。

在这里详细解释一个flyway中的两种字母开头的执行脚本的不同;

V 开头 vs R 开头脚本的区别

1. 版本化迁移脚本(V 前缀)

  • 命名规则
    V<Version>__<Description>.sql(例如 V1.2__Create_User_Table.sql

    • Version唯一不可变的版本号(建议使用语义化版本,如 1.0.1

    • Description:人类可读的描述(使用下划线分隔单词)

  • 核心特性

    • 一次性执行:每个脚本仅执行一次

    • 顺序敏感:按版本号顺序依次执行

    • 内容不可变:已执行的脚本内容不可修改(否则校验失败)

  • 典型场景

    • 创建/修改表结构

    • 新增索引或约束

    • 一次性数据迁移(如初始化基础数据)

2. 可重复迁移脚本(R 前缀)

  • 命名规则
    R__<Description>.sql(例如 R__Update_Product_View.sql

    • 没有版本号

    • Description:描述脚本作用(按字母顺序排序执行)

  • 核心特性

    • 重复执行:脚本内容变化时自动重新执行

    • 顺序依赖:按文件名字母顺序执行

    • 内容可变:允许修改后重新应用

  • 典型场景

    • 维护视图(View)或存储过程(Stored Procedure)

    • 更新静态数据(如多环境差异化配置)

    • 重建索引或物化视图

关键对比总结

特性V 前缀脚本R 前缀脚本
执行次数仅一次内容变化时重复执行
版本号必须唯一且递增无版本号
内容修改禁止修改(会导致校验失败)允许修改(触发重新执行)
执行顺序按版本号顺序按文件名字母顺序
适用场景结构变更、一次性操作可重复逻辑、数据维护

最佳实践建议

  1. 版本化脚本 (V)

    • 使用语义化版本(如 V1.2.3

    • 每个脚本完成一个独立的变更任务

    • 禁止修改已提交到代码仓库的 V 脚本

  2. 可重复脚本 (R)

    • 用于维护视图、存储过程等易变对象

    • 通过文件名控制执行顺序(如 R__01_ViewA.sqlR__02_ViewB.sql

    • 谨慎修改生产环境的 R 脚本(可能触发全量更新)

  3. 混合使用策略

    • 用 V 脚本管理表结构变更

    • 用 R 脚本管理视图和存储过程

示例:

db/migration/
├── V1.0__Create_Tables.sql
├── V1.1__Add_Indexes.sql
└── R__Update_Views.sql
  1. 校验保护

    • 生产环境务必启用 validate-on-migrate: true

    • 开发环境可开启 flyway.validate-migration-naming: true 强制命名校验

通过合理使用 V 和 R 脚本,可以实现数据库变更的 原子性 和 可追溯性,同时适应不同场景的灵活性需求。

2、使用spring boot项目整合flyway

2.1、新创建一个spring boot项目,并导入一些初始的依赖;

 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><!-- 无需指定版本(Spring Boot 已管理) --></dependency><!--  druid连接池  --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.18</version></dependency><!--    MySQL--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!-- 无需指定版本(Spring Boot 已管理) --><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-mysql</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency></dependencies>

需要注意的一点是,spring官方自动管理的flyway的版本,所以我们只需要指定spring的版本就自动会兼容合适的flyway版本,我的spring boot版本为3.3.9

我们主要使用到的依赖有三个:

flyway-core:flyway的核心依赖

flyway-mysql:指定数据库的类型

mybatis-spring-boot-starter: 数据源的自动配置,也可以是其他的依赖坐标。不一定要是mybatis,如JDBC、JPA等都可以

2.2、配置相应的yml配置文件

spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/testflyway?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCusername: rootpassword: 123456flyway:enabled: truelocations: ["classpath:db/migration"]  #  修正为数组格式table: flyway_schema_historybaseline-on-migrate: true  # 必须启用(处理已有表场景)sql-migration-prefix: "V"sql-migration-separator: "__"sql-migration-suffixes: [".sql"]  #  数组格式
logging:level:org.flywaydb: TRACE  # 输出最详细日志

我们只需要配置一些flyway的属性,就可以直接使用flyway了。

2.3、编写相应的sql执行语句,并且存放在固定的文件地址

-- 创建用户表
CREATE TABLE IF NOT EXISTS user (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,email VARCHAR(100) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);-- 初始数据插入
INSERT INTO user (username, email) VALUES('admin', 'admin@example.com'),('user1', 'user1@example.com');

我这里就创建了一张数据表,并且插入了一些数据;

将SQL脚本放在合适的位置:

注意SQL脚本的存放位置不是乱放的,要符合我们之前在yml配置文件中书写的配置,SQL脚本的名称也不是随便取得,要符合flyway的命名规范。

2.4、运行spring boot项目

我们配置好了这些之后,就可以直接启动spring boot项目了。如果你是第一次启动项目,flyway会自动扫描相应文件夹下的SQL脚本,并在你的数据库中建立一个历史记录表 flyway_schema_history。要特别注意的是我们千万不要手动的修改这张表中的任何数据,flyway就是根据这张历史记录表来进行SQL脚本的执行等等一系列操作。

我们可以直接在控制台中看到flyway已经顺利的执行我们相应的SQL脚本

我们现在可以连接一下数据库来看看是否正确

 

可以看到数据库中已经有了相应的数据表,并且数据表中已经有了一些初始数据了

这个是我们第一次启动spring boot项目时自动执行的SQL脚本。那么等我们第二次启动时,flyway还是会扫描相应的SQL脚本,同时查询 flyway_schema_history 历史表,来判断SQL脚本要不要执行。当我们在此运行spring boot项目:

我们在控制台的日志中可以很清楚的看到flyway的执行过程。

3、总结

以上,就是我们使用spring boot整合flyway来进行数据库的版本管理。总体来说是非常简单的,我们只需要一些简单的配置和遵守一些flyway的命名规定就可以直接使用flyway了。这也是spring官方一直在努力推行的

约定大于配置,配置大于编码

当然,flyway的功能还有很多,这篇文章也只是初步帮你认识一下flyway。并且使用spring boot来简单的使用flyway的基本功能,但总的来说,我们几乎可以只通过一些配置文件中属性来使用flyway的绝大部分功能,一下我整理了一些常用的flyway属性,供大家参考:

spring:flyway:# 基础配置enabled: true                       # 是否启用 Flyway,默认 trueurl: jdbc:mysql://localhost:3306/db # 覆盖默认数据库连接(可选)user: root                          # 覆盖默认数据库用户(可选)password: root                      # 覆盖默认数据库密码(可选)# 脚本管理locations:                          # 迁移脚本路径(默认 classpath:db/migration)- classpath:db/migrations- filesystem:/opt/migrationsencoding: UTF-8                     # 脚本文件编码,默认 UTF-8sql-migration-prefix: V             # 版本迁移脚本前缀,默认 "V"repeatable-sql-migration-prefix: R  # 可重复迁移脚本前缀,默认 "R"sql-migration-separator: __         # 脚本名称分隔符,默认双下划线sql-migration-suffixes:             # 脚本后缀列表,默认 [".sql"]- .sql- .pgsql# 迁移规则schemas: public                     # Flyway 管理的 schema 列表(逗号分隔)table: flyway_history               # 元数据表名,默认 "flyway_schema_history"baseline-on-migrate: false          # 迁移时自动执行基线(默认 false)baseline-version: 1                 # 基线版本号,默认 "1"baseline-description: Initial Setup # 基线描述target: latest                      # 目标版本(默认最新版本,可用版本号如 "3.1")out-of-order: false                 # 是否允许乱序执行迁移(默认 false)validate-on-migrate: true           # 迁移时校验脚本(默认 true)ignore-missing-migrations: false    # 忽略缺失的迁移记录(默认 false)# 占位符配置placeholder-replacement: true       # 启用占位符替换(默认 true)placeholders:                       # 自定义占位符键值对key1: value1key2: value2# 高级配置clean-on-validation-error: false    # 校验失败时自动执行 clean(危险!默认 false)connect-retries: 3                  # 连接失败重试次数(默认 0)lock-retry-count: 50                # 获取锁的重试次数(默认 50)group: false                        # 将相同版本的迁移合并为单个事务(默认 false)mixed: false                        # 是否允许混合 DDL 和 DML(默认 false)skip-default-callbacks: false       # 跳过默认回调(默认 false)skip-default-resolvers: false       # 跳过默认解析器(默认 false)init-sqls:                          # 获取连接后立即执行的 SQL 语句- SET ROLE 'myuser'# 多环境配置示例
---
spring:profiles: prodflyway:url: jdbc:mysql://prod-db:3306/prod_dblocations:- "classpath:db/migration/common"- "classpath:db/migration/prod"ignore-migration-patterns: "*:pending"

关键配置说明:

  1. 基础配置:默认会复用 spring.datasource 配置,需要覆盖时单独指定

  2. 脚本管理:通过前缀/后缀/路径控制脚本识别规则

  3. 迁移规则:控制基线、校验、执行顺序等核心行为

  4. 生产环境注意事项:

    • clean-on-validation-error 应始终保持 false

    • out-of-order 需谨慎启用

    • 建议明确指定 target 版本控制生产环境迁移

  5. 最佳实践:

    • 使用 classpath 和 filesystem 组合路径管理脚本

    • 通过 placeholders 实现环境差异化配置

    • 启用校验确保迁移安全

可以通过 flyway.validateMigrationNaming 配置项(默认 false)开启严格的脚本命名校验,建议开发环境开启。

flyway的官网地址为:https://flywaydb.org/

你有如果想了解更多有关flyway的信息,可以直接访问官网

相关文章:

spring boot整合flyway实现数据的动态维护

1、简单介绍一下flyway Flyway 是一款开源的数据库版本控制工具&#xff0c;主要用于管理数据库结构的变更&#xff08;如创建表、修改字段、插入数据等&#xff09;。它通过跟踪和执行版本化的迁移脚本&#xff0c;帮助团队实现数据库变更的自动化。接下来简单介绍一下flyway…...

unity中使用spine详解

一.Spine概述 Spine 是一款针对游戏开发的 2D 骨骼动画编辑工具。 Spine 旨在提供更高效和简洁 的工作流程&#xff0c;以创建游戏所需的动画。 Spine原理&#xff1a;将一个模型&#xff0c;根据动画的需求分成一些骨骼&#xff0c;一个骨骼对应一张贴图&#xff0c;控制骨骼…...

14. LangChain项目实战1——基于公司制度RAG回答机器人

教学视频&#xff1a; 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置&#xff1a; python版本&#xff1a;3.10.8 服务器&#xff1a;Ubuntu 依赖包requirements.txt文件内容&#xff1a; aiofiles23.2.1 …...

利用STM32TIM自制延迟函数实验

一、实验目的 掌握STM32定时器&#xff08;TIM&#xff09;的工作原理及配置方法学习使用HAL库实现微秒级/毫秒级延时函数理解定时器中断服务程序的编写规范 二、实验原理 ​定时器基础&#xff1a; STM32定时器包含向上计数器、向下计数器、中心对齐模式通过预分频器&#x…...

创建一个MCP服务器,并在Cline中使用,增强自定义功能。

MCP介绍 MCP 是一个开放协议&#xff0c;它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样&#xff0c;MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…...

Android Activity栈关系解析

在 Android 系统中&#xff0c;这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系&#xff0c;每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例&#xff1a; 1. ActivityRecord&#xff08;活动记录&#xff09; 是什么…...

java使用word模板填充内容,再生成pdf

1.word模板填充内容 使用EasyPoi写入Word文档。 import cn.afterturn.easypoi.word.WordExportUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.File; import java…...

回归实战详细代码+解析:预测新冠感染人数

回归实战&#xff1a;预测新冠感染人数 先回顾下回归是个啥玩意 首先需要一组训练集&#xff0c;说人话就是通过一系列x[x1,x2…xn]通过神秘计算得到y的过程&#xff0c;当然人和机器现在都不知道什么计算是什么&#xff0c;这是一个黑箱。 黑箱比喻&#xff1a;把模型想象成自…...

AI人工智能机器学习之聚类分析

1、概要 本篇学习AI人工智能机器学习之聚类分析&#xff0c;以KMeans、AgglomerativeClustering、DBSCAN为例&#xff0c;从代码层面讲述机器学习中的聚类分析。 2、聚类分析 - 简介 聚类分析是一种无监督学习的方法&#xff0c;用于将数据集中的样本划分为不同的组&#xff…...

(下:补充——五个模型的理论基础)深度学习——图像分类篇章

目录 1.1 卷积神经网络基础 3.1 AlexNet网络结构详解与花分类数据集下载 4.1 VGG网络详解及感受野的计算 5.1 GoogLeNet网络详解 6.1 ResNet网络结构&#xff0c;BN以及迁移学习详解 总结&#xff08;可以直接看总结&#xff09; 1.1 卷积神经网络基础 视频讲解&#xf…...

使用Python自动生成图文并茂的网页分析报告

在数据分析中&#xff0c;不管是市场研究还是科学分析&#xff0c;经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件&#xff0c;这种方式不便之处是不方便跟动态文字段落结合在一起&#xff0c;也不方便分…...

uniapp-原生android插件开发摘要

uni-app在App侧的原生扩展插件&#xff0c;支持使用java、object-c等原生语言编写&#xff0c;从HBuilderX 3.6起&#xff0c;新增支持了使用uts来开发原生插件。 基础项目 UniPlugin-Hello-AS工程请在App离线SDK中查找 基础项目(App离线SDK)已经配置好了自定义插件所需要的…...

GIT工具学习【1】:基本操作

目录 0.本地代码分区1.配置自己的个人信息&#xff08;设置一次即可&#xff09;2.新建仓库3.提交代码到暂存区&#xff08;加入购物车&#xff09;4.从暂存区撤回&#xff08;不会改变工作区文件&#xff09;5.恢复指定版本&#xff08;会改变工作区文件&#xff09;5.1&#…...

《国密算法开发实战:从合规落地到性能优化》

前言 随着信息技术的飞速发展,信息安全已成为全球关注的焦点。在数字化时代,数据的保密性、完整性和可用性直接关系到国家、企业和个人的利益。为了保障信息安全,密码技术作为核心支撑,发挥着至关重要的作用。国密算法,即国家密码算法,是我国自主设计和推广的一系列密码…...

【语法】C++中string类中的两个问题及解答

贴主在学习string类时遇到过两个困扰我的问题&#xff0c;今天拿出来给大家分享一下我是如何解决的 一、扩容时capacity的增长问题 在string的capacity()接口中&#xff0c;调用的是这个string对象的容量(可以存多少个有效字符)&#xff0c;而size()是调用的string对象现在有…...

LeetCode-154. 寻找旋转排序数组中的最小值 II

1、题目描述&#xff1a; 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1a; 若旋转 4 次&#xff0c;则可以得到 [4,5,6,7,0,…...

2.数据结构:1.Tire 字符串统计

1.Tire 字符串统计 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 层&#xff0c;每一层至多 26 个节点&#xff08;字母&#xff09; int cnt[N];//字符串至多 N 个&#xff…...

C语言复习4:有关数组的基础常见算法

# 数组的常见算法 - 查找算法 1. 基本查找/顺序查找 2. 二分查找/折半查找 3. 插值查找 4. 分块查找 5. 哈希查找 6. 树表查找 7. 斐波那契查找 - 排序算法&#xff08;顾名思义&#xff0c;就是把没有顺序的…...

Ubuntu从零创建Hadoop集群

目录 前言 前提准备 1.设置网关和网段 2.查看虚拟机IP及检查网络 3.Ubuntu相关配置 镜像源配置 下载 vim编辑器 4.设置静态IP和SSH免密(可选) 设置静态IP SSH免密 5.JDK环境部署 6.Hadoop环境部署 7.配置 Hadoop 配置文件 HDFS集群规划 HDFS集群配置 1.配…...

GPIO概念

GPIO通用输入输出口 在芯片内部存在多个GPIO&#xff0c;每个GPIO用于管理多个芯片进行输入&#xff0c;输出工作 引脚电平 0v ~3.3v&#xff0c;部分引脚可容任5v 输出模式下可控制端口输出高低电平&#xff0c;可以驱动LED&#xff0c;控制蜂鸣器&#xff0c;模拟通信协议&a…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...