Flyway 数据库版本管理
一、Flyway简介
Flyway是一款开源的数据库迁移工具,可以管理和版本化数据库架构。通过Flyway,可以跟踪数据库的变化,并将这些变化作为版本控制的一部分。Flyway支持SQL和NoSQL数据库,并且可以与现有的开发流程无缝集成,如持续集成(CI)和持续部署(CD)。
二、Flyway主要特性
Flyway的主要特性包括:
- 版本化迁移(Versioned Migrations):通过一系列的SQL脚本逐步更新数据库架构,每个迁移脚本都有一个唯一的版本号,例如
V1__Initial_setup.sql。当Flyway运行时,它会检查数据库中的flyway_schema_history表,以确定哪些迁移脚本已经执行过了。如果发现有未执行的迁移脚本,Flyway将按照版本号的顺序执行它们。 - 回退迁移(Undo Migrations):是指在某些情况下,可能需要将数据库回滚到一个先前的状态。Flyway并没有内置的回退机制,但它提供了基础设施,允许你在迁移脚本中定义回退逻辑。通常是通过在迁移脚本中指定一个相反的迁移脚本来实现的。例如,如果你有一个迁移脚本
V2__Add_new_column.sql,你可以创建一个对应的回退脚本R2__Drop_new_column.sql,其中R2表示这是一个回退脚本。在需要回滚时,Flyway会执行相应的回退脚本,将数据库回滚到上一个稳定的状态。 - 可重复迁移(Repeatable Migration):是与版本化迁移不同的另一种类型的迁移,它不依赖于版本号。这种迁移脚本通常用于那些不需要跟踪版本的变更,比如对数据库性能调优的脚本。Flyway会简单地将这些脚本视为一组独立的更改,并在每次运行时执行它们。
- 多数据库支持:Flyway支持多种关系型数据库,如MySQL、Oracle、PostgreSQL等,使得在不同数据库间迁移变得容易。
- 自动化迁移:Flyway可以在应用程序启动时自动执行迁移脚本,或者通过命令行手动执行,提高了迁移的效率和可靠性。
- 集成到开发流程:Flyway可以集成到持续集成(CI)和持续部署(CD)流程中,确保数据库结构随着应用程序的发展而保持同步。
三、Flyway的工作流程
Flyway的设计哲学是约定优于配置,这意味着它遵循一些预定义的规则来简化数据库迁移的过程。下面是Flyway的基本工作流程:
- 初始化:当你首次运行Flyway时,它会根据配置在数据库中创建一个名为
flyway_schema_history的表,这个表用来记录所有的迁移活动,包括迁移的版本号、描述、执行的SQL文件名、执行时间和是否成功等信息。 - 扫描迁移脚本:Flyway会扫描指定的目录(通常是
classpath:db/migration)以查找迁移脚本。这些脚本通常命名为V<version>__<description>.sql,其中<version>是迁移的版本号,<description>是对迁移的简短描述。 - 比较版本号:Flyway会比较数据库中的
flyway_schema_history表记录的当前版本号与现有迁移脚本中的版本号。如果存在未执行的迁移脚本,Flyway将会执行它们。 - 执行迁移:对于每个需要执行的迁移脚本,Flyway会将其作为一个事务执行。如果在执行过程中出现错误,Flyway会回滚整个事务,并记录错误信息。
- 记录迁移结果:一旦迁移脚本执行完毕,无论是成功还是失败,Flyway都会在flyway_schema_history表中记录下迁移的结果。
- 重复执行:如果需要,你可以重复执行Flyway的迁移过程,以应用新的迁移脚本。Flyway会识别哪些迁移已经被执行过,并跳过它们。
四、与SpringBoot项目整合
4.1 添加依赖
到项目的pom文件中添加Flyway的依赖包。
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-mysql</artifactId><version>8.5.13</version>
</dependency>
4.2 修改配置
到项目的application.yaml文件中添加Flyway的配置信息。
sping:flyway:#是否开启flyway,默认trueenabled: true#当迁移时发现目标schema非空,而且没有元数据的表时,(即迭代中项目应为true)是否自动执行基准迁移,默认false.baseline-on-migrate: true# 是否允许无序运行迁移, 默认false,建议开发环境开启,生成环境关闭out-of-order: false#设定SQL脚本的目录,可以配置多个,比如为classpath:db/migration,filesystem:/sql-migrations,默认classpath:db/migrationlocations:- classpath:db/migration
常用配置项如下:
- spring.flyway.enabled: 是否启用Flyway,默认为true。
- spring.flyway.table: Flyway元数据表的名称,默认为flyway_schema_history。
- spring.flyway.encoding: 迁移脚本文件的编码,默认为UTF-8。
- spring.flyway.validate-on-migrate: 迁移时是否进行验证,默认为true。
- spring.flyway.check-location: 是否检查迁移脚本的位置是否存在,默认为true。
- spring.flyway.clean-disabled: 是否禁用Flyway的clean操作,默认为false。
- spring.flyway.baseline-on-migrate: 当迁移时发现目标schema非空,并且没有元数据的表时,是否自动执行基准迁移,默认为false。
- spring.flyway.baseline-version: 开始执行基准迁移时对现有schema的版本打标签,默认为1。
- spring.flyway.locations: 迁移脚本的位置,默认为classpath:db/migration。
- spring.flyway.sql-migration-prefix: 迁移文件的前缀,默认为V。
- spring.flyway.sql-migration-suffix: 迁移脚本的后缀,默认为.sql。
- spring.flyway.out-of-order: 是否允许无序的迁移,默认为false。
- spring.flyway.schemas: 需要Flyway迁移的schema,默认为连接默认的schema。
4.3 编写sql脚本文件
sql脚本文件名称要符合flyway规范,命名规则如下:
- 版本迁移脚本(Versioned Migrations):脚本文件名的前缀通常是
V,后跟版本号(版本号之间可以用点.或下划线_分隔),版本号后面是__双下划线的分隔符,分隔符后面是文件描述,最后是文件后缀名。例如:V1__Initial_Setup.sql、V1.1.2__Initial_Setup.sql、V1.1.2_1__Initial_Setup.sql。 - 回退迁移(Undo Migrations):脚本文件名的前缀为
U,前缀后面部分与版本迁移脚本的文件名相同。例如:U1__Initial_Setup.sql、U1.1.2__Initial_Setup.sql、U1.1.2_1__Initial_Setup.sql。 - 可重复迁移脚本(Repeatable Migrations):脚本文件名的前缀是
R,由于不依赖版本号,所以后面可以直接跟分隔符和脚本名称。例如R__truncate_user_dml.sql。

默认情况下sql脚本文件都放在src\main\resources\db\migration下:

4.4 启动项目自动完成脚跟更新
项目启动日志中打印出Flyway 的脚本执行信息如下:

五、错误总结
Spring Boot版本是2.5.12,MySQL用的是8.2。
-
Unsupported Database: MySQL 8.2
这个问题是由于开始用的Flyway 依赖是flyway-core的8.5.13版本,后面换成flyway-mysql的8.5.13版本解决问题。 -
Validate failed: Migrations have failed validation
(1)Either revert the changes to the migration, or run repair to update the schema history.
这个问题是由于脚本已经被migration 过了,后面又对这个脚本做了修改所导致的。所以已经被migration 过脚本文件一定不要再去修改,实在要改的话重新写个脚本文件去修改。这里解决问题是删掉flyway_schema_history表中之前执行过的记录,这样重新再启动的时候Flyway 校验这个脚本时找不到之前执行过的记录,就会认为这是个全新的脚本不会与之前执行过的脚本有冲突,才会再次执行这个脚本。其实这样改还不是很好,因为这个脚本的的确确已经执行过一次,如果这个脚本是个添加一条记录的语句,你后面只是在这个语句中多加了个字段,然后再次去执行,那结果就是再新增一条类似的数据,而我们的本意其实只是想改动之前的数据,所以如果不小心改动了之前已经migration 过的脚本,最好连同这个脚本执行过的sql记录也一起删掉。
(2)Please remove any half-completed changes then run repair to fix the schema history.
这个问题是由于在项目启动时Flyway 执行脚本出错,但是flyway_schema_history表中已经记录了这次脚本的migration失败的操作, 当你修改完脚本后再次启动项目时,发现flyway_schema_history表中有过这个脚本的migration操作,从而导致校验不通过。这种情况只需要把flyway_schema_history表中这个脚本之前失败的记录删除重启项目就可以,因为之前执行该脚本时,该脚本的sql报错并没有对数据库进行实际的操作,所以也就不用去数据库删除之前这个脚本操作产生的实际数据了。 -
Flyway failed to initialize: none of the following migration scripts locations could be found
这个问题是由于没找到sql脚本文件,可能是设置指定存放sql脚本的目录出错或者目录中压根没有脚本文件。我这个是没有脚本文件,项目启动时报的错,随便添加个空的脚本文件后就能正常启动了。
相关文章:
Flyway 数据库版本管理
一、Flyway简介 Flyway是一款开源的数据库迁移工具,可以管理和版本化数据库架构。通过Flyway,可以跟踪数据库的变化,并将这些变化作为版本控制的一部分。Flyway支持SQL和NoSQL数据库,并且可以与现有的开发流程无缝集成࿰…...
lua学习笔记19(面相对象学习的一点总结)
print("*****************************面相对象总结*******************************") object{} --实例化方法 function object:new()local obj{}self.__indexselfsetmetatable(obj,self)return obj end-------------------------如何new一个对象 function object:…...
视觉SLAM学习打卡【10】-后端·滑动窗口法位姿图
本节是对上一节BA的进一步简化,旨在提高优化实时性.难点在于位姿图部分的雅可比矩阵求解(涉及李代数扰动模型求导),书中的相关推导存在跳步(可能数学功底强的人认为过渡的理所当然),笔者参考了知…...
【动态规划 区间dp 位运算】100259. 划分数组得到最小的值之和
本文涉及知识点 动态规划 区间dp 位运算 LeetCode100259. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues,长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组,对于第 ith 个子数…...
CSS核心样式-02-盒模型属性及扩展应用
目录 三、盒模型属性 常见盒模型区域 盒模型图 盒模型五大属性 1. 宽度 width 2. 高度 height 3. 内边距 padding 四值法 三值法 二值法 单值法 案例 4. 边框 border 按照属性值的类型划分为三个单一属性 ①线宽 border-width ②线型 border-style ③边框颜色 bo…...
在 Google Cloud 上轻松部署开放大语言模型
今天,“在 Google Cloud 上部署”功能正式上线! 这是 Hugging Face Hub 上的一个新功能,让开发者可以轻松地将数千个基础模型使用 Vertex AI 或 Google Kubernetes Engine (GKE) 部署到 Google Cloud。 Model Garden (模型库) 是 Google Clou…...
005Node.js模块URL的使用
引入 URL 模块 要使用 URL 模块,首先需要在代码中引入它。可以使用以下代码将 URL 模块导入到你的脚本中: const url require(url);实例代码 const urlrequire(url); var apihttp://www.baidu.com?nameshixiaobin&age20; console.log(url.parse(…...
美团笔试复盘
昨天做了美团的笔试,现在复盘一下。 1、将数组按照绝对值大小排序 有道算法题解决思路需要将数组按照绝对值大小进行排序,我使用的是sort方法Comparator比较器实现的,这里记录一下: public static void main(String[] args) {In…...
IntelliJ IDEA - Since Maven 3.8.1 http repositories are blocked
问题描述 新下载的 IDEA 在构建项目时,在下载引用的包时出现 “Since Maven 3.8.1 http repositories are blocked” 的问题。 原因分析 从 Maven 3.8.1 开始,不再支持 http 的包了。由于现在对网络安全的日益重视,都在向 https 转变&#…...
Django的APP应用更名(重命名)流程
将Django中的一个现有APP更名是一个需要谨慎操作的过程,因为它涉及到多个文件和配置的更新。下面是详细的步骤和一些补充细节,帮助你更顺利地完成APP重命名: 1. 修改APP名称及相关引用 更改APP目录名称: 首先,重命名…...
ChatGLM3-6B大语言模型离线执行
ChatGLM3-6B大语言模型离线执行 模型准备 一般而言,模型和模型参数可以通过如下三个模型源进行相应的下载: HuggingFace | ModelScope | WiseModel 本实例中,使用的是HuggingFace的源下载,相应的地址如下: HuggingFa…...
了解大语言模型的参数高效微调(Parameter-Effcient Fine-Tuning)
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 大语言模型在众多应用领域实现了突破性的进步,显著提升了各种任务的完成度。然而,其庞大的规模也带来了高昂的计算成本。这些模型往往包含数十亿甚至上千亿参数,需要…...
2024.4.14力扣每日一题——设计哈希集合
2024.4.14 题目来源我的题解方法一 链表数组 题目来源 力扣每日一题;题序:705 我的题解 方法一 链表数组 由于给定限制次数为10000,所以构造一个长度为10001的链表数组。对于add操作先看数组对应的位置是否为null或者为空,若是…...
SQL explain 显示子查询A类型为ALL怎么优化
当 SQL EXPLAIN 显示子查询 A 的类型为 ALL 时,这意味着数据库系统正在执行全表扫描,而不是使用索引来执行子查询。全表扫描可能会导致性能下降,特别是在大型表上。 为了优化这种情况,您可以考虑以下几点: 1. **索引…...
网络协议学习——IP协议
IP(Internet Protocol,互联网协议)是网络中最基本的协议之一,负责在互联网中进行数据包的传输。下面是对IP协议的详细讲解: IP协议的作用 IP协议是在网络层(第三层)上工作的协议,它的…...
MATLAB初学者入门(1)—— 基础知识和功能介绍
MATLAB(Matrix Laboratory)是一种用于数值计算、可视化以及编程的高性能语言环境。它广泛应用于工程、科学研究和教育等领域。以下是对MATLAB基础知识和编程技巧的系统性讲解,分为几个主要部分: 1. 基础操作 变量和表达式 在MAT…...
React Css 四种引入方式
React CSS 内联样式 优点 样式之间不会有冲突可以动态获取组件中state的值 缺点 要使用驼峰标识部分样式没有很友好的提示如果大量去写内敛样式 容易造成代码混乱伪类和伪元素无法编写 class HighCom extends PureComponent {constructor(props) {super(props)this.state…...
题目:输入3个数a,b,c,按大小顺序输出。
题目:输入3个数a,b,c,按大小顺序输出。 There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried abou…...
AI预测体彩排3第3弹【2024年4月14日预测--第1套算法开始计算第3次测试】
今天咱们继续测试第1套算法和模型,今天是第3次测试,目前的测试只是为了记录和验证,不建议大家盲目跟买。我的目标仍旧是10次命中3-4次!~废话不多说了,直接上结果! 2024年4月14日排3的七码预测结果如下 第一套&…...
Android 在xml 布局中如何嵌套 Jetpack Compose
最近在项目开发的过程中需要用到 Jetpack Compose,之前没有接触过Compose,所以项目一直没有用到Compose。通过查看官网发现Compose上手比较快,但是准备比较复杂的布局要转换成Compose 不是一件容易的事情。那有没有可能只是对成熟的项目中的x…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
