Spring Boot学习:Flyway详解
Flyway
Flyway 是一款开源的数据库版本管理工具,用于管理和自动化数据库结构的变更。它可以跟踪和管理数据库的版本控制,并在应用程序启动时自动执行升级或回滚操作。
使用Flyway,你可以将数据库的变更以可重复且可控的方式应用到不同环境中,如开发、测试和生产环境。它支持多种数据库系统,包括MySQL、Oracle、PostgreSQL、SQL Server等。
Flyway将数据库结构的变更定义为一系列迁移脚本,通常是SQL脚本文件。每个迁移脚本都有一个唯一的版本号,Flyway会按照版本号的顺序依次执行这些脚本,以达到数据库结构的变更和更新。当应用程序启动时,Flyway会自动检测并执行未应用的迁移脚本,将数据库升级到最新版本。如果需要回滚到之前的版本,Flyway也提供了回滚操作的支持。
通过使用Flyway,开发团队可以更好地管理数据库结构的变更,保持不同环境之间的数据库一致性,并轻松地进行版本控制和追踪。
官方文档:https://documentation.red-gate.com/fd/
Flyway 工作流程
1、检测数据库状态:Flyway会连接到配置的数据库,并检测当前数据库的状态,包括已应用的迁移脚本版本和未应用的迁移脚本。
2、执行迁移脚本:Flyway会将未应用的迁移脚本按照版本号的顺序逐一执行。它会查找项目中指定的迁移脚本目录(默认为db/migration),并依次运行其中的SQL脚本。
3、更新数据库状态:每当一个迁移脚本成功执行后,Flyway会将其记录为已应用的脚本,并将其版本号存储在数据库的元数据表( flyway_schema_history)中,以便下次启动时进行跟踪和管理。
Spring Boot集成Flyway
1、添加依赖
在项目的pom.xml文件中,添加Flyway的Maven依赖,如果是springboot 2.xx,使用5.2.1或5.2.4:
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>${flyway-core.version}</version></dependency>
2、数据库连接信息配置
在Spring Boot项目的application.properties或者application.yml文件中配置数据库的连接信息,例如:
spring.datasource.url=jdbc:mysql://localhost:3306/db_example
spring.datasource.username=dbuser
spring.datasource.password=dbpass
3、Flyway配置
在Spring Boot项目的application.properties或者application.yml文件中进行Flyway的相关配置,例如
# Flyway配置
#开启flyway功能,默认为true
spring.flyway.enabled=true
# 用于存储迁移历史记录的表名,默认为flyway_schema_history
spring.flyway.table=flyway_schema_history
# 迁移脚本编码,默认为UTF-8
spring.flyway.encoding=UTF-8
# 当迁移数据库存在但没有元数据的表时,自动执行基准迁移,新建flyway_schema_history表
spring.flyway.baseline-on-migrate=true
# 数据库迁移脚本的位置,默认为classpath:db/migration
spring.flyway.locations=classpath:db/migration
# SQL迁移脚本文件名前缀,默认为V
spring.flyway.sql-migration-prefix=V
# SQL迁移脚本文件名后缀,默认为.sql
spring.flyway.sql-migration-suffixes=.sql
# 是否在迁移时验证脚本,默认为true
spring.flyway.validate-on-migrate=true
# 检测迁移脚本的路径是否存在,默认为true,如不存在,则抛出异常,如果不想抛出异常可设为flase
spring.flyway.check-location=false
# 用于控制是否禁用 Flyway 的 clean 操作。
spring.flyway.clean-disabled=true
大家可以按照自己的需求来进行配置,上述配置除了spring.flyway.baseline-on-migrate和spring.flyway.clean-disabled,其他都比较见名知义,所以下面讲解下
spring.flyway.baseline-on-migrate
当spring.flyway.baseline-on-migrate属性设置为true时,Flyway会自动创建一个名为flyway_schema_history的表,并将当前数据库的schema版本设置为目前最新的迁移脚本版本。
具体来说,这个属性的作用包括:
- 当数据库中不存在迁移历史记录表时,Flyway 会自动创建该表,并将当前已经存在的数据库对象标记为已迁移状态。
- 当数据库中存在迁移历史记录表,但版本号低于最新的迁移脚本版本时,Flyway 也会自动创建一个基线版本,从而将现有的数据库对象标记为已迁移状态,并开始应用最新的迁移脚本。
这样做的目的是确保在已有数据库上使用 Flyway 进行迁移时,无论数据库是否已经有迁移历史记录,都能够正确地进行迁移操作。这在初始化应用程序时特别有用,因为它允许你在部署应用程序到新环境时,自动初始化数据库并应用最新的迁移脚本。
spring.flyway.clean-disabled
spring.flyway.clean-disabled 用于控制是否禁用 Flyway 的 clean 操作。
clean 操作是 Flyway 的一个功能,可以清空数据库中的所有对象(比如表、视图、存储过程等),以便进行全新的数据库迁移。在开发和测试阶段,这可能是有用的,因为它可以确保每次都从一个干净的数据库状态开始运行。但在生产环境中,执行 clean 操作可能会导致数据丢失,因此通常需要禁用它。
4、创建迁移脚本
在项目的src/main/resources/db/migration目录下创建数据库迁移脚本,命名规范为V1__Description.sql,其中V1是版本号,Description是描述。例如,可以创建一个V1.1__CreateTable.sql的文件来创建表。
Flyway 的 SQL 脚本命名规则:
-
版本号:SQL 脚本的文件名应该以一个版本号开头,版本号可以是数字序列或者带有点号分隔的数字序列,用来表示数据库结构的变更顺序。例如,V1.1__Create_Table.sql 或 V1.2__Add_Column.sql。
-
描述性名称:在版本号之后,使用双下划线 __ 分隔,并在其后添加描述性的名称,用来清晰地表明这个脚本的作用。例如,V1__Create_Table.sql 中的 “Create_Table” 就是一个描述性的名称。
根据以上的命名规则,Flyway 会按照版本号的顺序依次执行 SQL 脚本。在 SQL 脚本的编写中,你可以包含所有标准的 SQL 语句,比如 CREATE TABLE、ALTER TABLE、INSERT 等,以及适用于特定数据库的特性和语法。
如果我们一个版本下有多个文件,那还可以在版本后面使用序号来区分排序
实例:V1.1.0版本下,001为创建脚本,002为更新脚本
V1.1.0_001__create_table.sql
V1.1.0_002__insert_table.sql
Flyway 还提供了一种特殊的 SQL 脚本命名规则,用于标识可重复执行的 SQL 脚本。这种命名规则是基于前缀 R__ 的方式,以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾
命名规则如下:
格式:R__<描述>.sql
示例:R__Initialize_Data.sql、R__Cleanup_Data.sql
可重复执行的 SQL 脚本指的是可以在任何数据库版本上多次运行而不会造成影响的脚本,通常用于执行一些初始化或数据清理等操作。
5、启动项目,flyway执行脚本
当我们把spring.flyway.baseline-on-migrate属性设为true的时候,第一次启动项目会为我们创建flyway_schema_history表,并执行相应的脚本
下面是表的字段说明
installed_rank:已安装的迁移脚本的排名(从 1 开始)。
version:迁移脚本的版本号。
description:迁移脚本的描述。
type:迁移脚本的类型(SQL、JAVA 等)。
script:迁移脚本的文件名。
checksum:迁移脚本的校验和。
installed_by:安装迁移脚本的用户。
installed_on:安装迁移脚本的时间戳。
execution_time:执行迁移脚本所需的时间(以毫秒为单位)。
success:表示迁移脚本是否成功安装。
说明,如果我们是spring.flyway.baseline-on-migrate=true自动生成的flyway_schema_history表,那么version字段默认值为1,此时的sql脚本必须比1大才会执行,比如V1.1,V1.1.0,V2等,如果使用V1命名我们的sql脚本,则脚本不会执行
相关文章:
Spring Boot学习:Flyway详解
Flyway Flyway 是一款开源的数据库版本管理工具,用于管理和自动化数据库结构的变更。它可以跟踪和管理数据库的版本控制,并在应用程序启动时自动执行升级或回滚操作。 使用Flyway,你可以将数据库的变更以可重复且可控的方式应用到不同环境中…...
Spark编程实验三:Spark SQL编程
目录 一、目的与要求 二、实验内容 三、实验步骤 1、Spark SQL基本操作 2、编程实现将RDD转换为DataFrame 3、编程实现利用DataFrame读写MySQL的数据 四、结果分析与实验体会 一、目的与要求 1、通过实验掌握Spark SQL的基本编程方法; 2、熟悉RDD到DataFram…...
文献研读|Prompt窃取与保护综述
本文介绍与「Prompt窃取与保护」相关的几篇工作。 目录 1. Prompt Stealing Attacks Against Text-to-Image Generation Models(PromptStealer)2. Hard Prompts Made Easy: Gradient-Based Discrete Optimization for Prompt Tuning and Discovery&#…...
cfa一级考生复习经验分享系列(十四)
首先说一下自己的背景,一个和金融没有半毛钱关系的数据分析师,之前考出了FRM。这次用一个半月突击12月的1级考试拿到了9A1B的成绩,纯属运气。以下纯属经(chě)验(dn),请看看就好&…...
vue本地缓存搜索记录(最多4条)
核心代码 //保存到搜索历史,最多存四个 item.name和item.code格式为:塞力斯000001var history uni.getStorageSync(history) || [];console.log("history", history)var index history.findIndex((items) > {return item.name items.nam…...
Linux创建Macvlan网络
最近在看Docker的网络,测试Macvlan部分时,发现Docker创建Macvlan与预期测试结果不一样。所以查阅了Linux下配置Macvlan,记录如下。 参考 1.Linux Macvlan 2.图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN 3.创建ma…...
从企业级负载均衡到云原生,深入解读F5
上世纪九十年代,Internet快速发展催生了大量在线网站,Web访问量迅速提升。在互联网泡沫破灭前,这个领域基本是围绕如何对Web网站进行负载均衡与优化。从1997年F5发布了BIG-IP,到快速地形成完整ADC产品线,企业级负载均衡…...
什么是redis雪崩
Redis雪崩是指在使用Redis作为缓存数据库时,由于某种原因导致Redis服务器不可用或性能严重下降,从而导致大量的请求集中到数据库服务器上,甚至直接导致数据库服务器崩溃。 当Redis服务器出现雪崩时,原本应该被缓存的数据无法从缓…...
[足式机器人]Part2 Dr. CAN学习笔记-Ch00 - 数学知识基础
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Ch00 - 数学知识基础 1. Ch0-1矩阵的导数运算1.1标量向量方程对向量求导,分母布局,分子布局1.1.1 标量方程对向量的导数1.1.2 向量方程对向量的导数 1.2 案例分析…...
Jmeter、postman、python 三大主流技术如何操作数据库?
只要是做测试工作的,必然会接触到数据库 1、前言 只要是做测试工作的,必然会接触到数据库,数据库在工作中的主要应用场景包括但不限于以下: 功能测试中,涉及数据展示功能,需查库校验数据正确及完整性&…...
IRIS、Cache系统类汉化
文章目录 系统类汉化简介标签说明汉化系统包说明效果展示类分类%Library包下的类重点类非重点类弃用类数据类型类工具类 使用说明 系统类汉化 简介 帮助小伙伴更加容易理解后台系统程序方法使用,降低代码的难度。符合本土化中文环境的开发和维护,有助于…...
【三维生成】稀疏重建、Image-to-3D方法(汇总)
系列文章目录 总结一下近5年的三维生成算法,持续更新 文章目录 系列文章目录一、LRM:单图像的大模型重建(2023)摘要1.前言2.Method3.实验 二、SSDNeRF:单阶段Diffusion NeRF的三维生成和重建(ICCV 2023&am…...
Java基础知识:单元测试和调试技巧
在Java编程中,单元测试和调试是提高代码质量和开发效率的重要环节。通过单元测试,我们可以验证代码的正确性,而调试则帮助我们找出并修复代码中的错误。本文将介绍Java中的单元测试和调试技巧,并提供相关示例代码,帮助…...
[c]扫雷
题目描述 扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。 玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中…...
数据结构-十大排序算法
数据结构十大排序算法 十大排序算法分别是直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、外部排序。 其中插入排序包括直接插入排序、折半插入排序、希尔排序;交换排序包括冒泡排序、快速排序࿱…...
Apache RocketMQ,构建云原生统一消息引擎
本文整理于 2023 年云栖大会林清山带来的主题演讲《Apache RocketMQ 云原生统一消息引擎》 演讲嘉宾: 林清山(花名:隆基),Apache RocketMQ 联合创始人,阿里云资深技术专家,阿里云消息产品线负…...
(四) ClickHouse 中使用 `MaterializedMySQL` 引擎单独同步 MySQL 数据库中的特定表(例如 `aaa` 和 `bbb`)
要在 ClickHouse 中使用 MaterializedMySQL 引擎单独同步 MySQL 数据库中的特定表(例如 aaa 和 bbb),您可以使用 TABLE OVERRIDE 功能。这个功能允许您指定要同步的特定表,同时忽略其他表。以下是步骤说明: 1. 启用 M…...
TikTok真题第4天 | 1366. 通过投票对团队排名、1029.两地调度、562.矩阵中最长的连续1线段
1366. 通过投票对团队排名 题目链接:rank-teams-by-votes/ 解法: 这道题就是统计每个队伍在每个排名的投票数,队伍为A、B、C,则排名有1、2、3,按照投票数进行降序排列。如果有队伍在每个排名的投票数都一样…...
时序预测 | Matlab实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络时间序列预测
时序预测 | Matlab实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短…...
负载均衡——Ribbon
文章目录 Ribbon和Eureka配合使用项目引入RibbonRestTemplate添加LoadBalanced注解注意自定义均衡方式代码注册方式配置方式 Ribbon脱离Eureka使用 Ribbon,Nexflix发布的负载均衡器,有助于控制HTTP和TCP客户端的行为。基于某种负载均衡算法(轮…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
