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

Flyway SpringBoot中使用

Flyway

一、 介绍

通过版本化数据库,提高数据库迁移的可靠性。即启动项目时就按版本执行sql脚本,实现数据库自动迁移。
Flyway是一款开源的数据库版本管理工具,它能够实现数据库迁移和版本控制。Flyway通过SQL脚本或Java代码进行数据库变更,支持多种数据库,如MySQL、Oracle、SQL Server等。它可以帮助团队更加方便、合理地管理数据库变更,实现数据库的自动化迁移、备份和还原等操作

官网:https://flywaydb.org/
github: https://github.com/flyway/flyway
官方文档:https://documentation.red-gate.com/flyway/quickstart-how-flyway-works

二、 原理

  1. 初次运行Flyway时,flyway会在数据库中创建flyway_schema_history表,用于记录schema的变化记录;如果数据库不是空库且配置项baseline-on-migrate=true,表中会初始化一条数据,代表初始的数据库状态,type=baseline;即基线库
    在这里插入图片描述
  2. flyway扫描应用程序下的脚本进行执行,脚本可以是Sql脚本或者java脚本;执行时会按照版本号排序,按从小到大执行;
  3. 每执行一个脚本,就会在flyway_schema_history表插入一条记录,记录版本、描述、类型、脚本名称、校验和、安装人、安装时间、执行耗时、成功否;
  4. 有了新的数据库变化,写入新的sql脚本,运行flyway,flyway会再次扫描脚本文件,和数据库flyway_schema_history中的记录做对比,并检查已经执行过的脚本的校验和,如果和数据库记录不一致,则抛出异常,即已经执行过的脚本不能修改;
  5. 校验和没问题,则把没执行过的且版本号大于最后执行记录版本的脚本排序,依次执行;没执行过但版本号小于记录版本的,也不会执行;

按照flyway执行逻辑,仅需要维护数据库创建脚本,以及后续的更新脚本即可记录数据库的整个生命周期,到新环境部署也没有任何问题

三、SpringBoot集成(mysql数据库)

3.1 pom

核心依赖包

<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId>
</dependency>

全量基础依赖,有的版本需要引入flyway-mysql的包

	<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version></dependency><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId></dependency><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-mysql</artifactId></dependency></dependencies>
3.2 编写脚本文件
  1. 脚本位置: 默认在resouces/db/migration
  2. 脚本命名规则: V<version>__<description>.sql
    在这里插入图片描述
前缀(Prefix):
  • V:表示这是一个有版本号的数据库迁移脚本。
  • U:表示这是一个用于回滚特定版本的数据库迁移脚本(不是所有Flyway版本都支持U前缀)。
  • R:表示这是一个可重复运行的迁移脚本,它会在每次迁移时运行,无论其是否已经运行过。
  • B:基线迁移
版本号(Version):

紧跟在前缀后面的是版本号,它用于确定迁移脚本的执行顺序。
版本号通常采用主版本号.次版本号.修订版本号的格式,例如1.0.0。
Flyway会根据版本号的大小顺序来执行数据库迁移脚本。

分隔符(Separator):

在版本号和描述之间,通常使用双下划线__作为分隔符。

描述(Description):

描述字段用于简要说明迁移脚本的作用或内容。
描述可以是任何字符串,但为了清晰起见,建议使用下划线_或空格进行分隔。

后缀(Suffix):

表示这是一个SQL文件,因此后缀应为.sql。

示例:
  • V1.0.0__Create_user_table.sql:表示一个版本号为1.0.0的迁移脚本,用于创建用户表。
  • R__Reset_data.sql:表示一个可重复运行的迁移脚本,用于重置数据。

正常配置spring的数据库链接,启动项目即可,项目每次启动都会检查并执行脚本;

注意baseline-on-migrate 默认情况下是false, 表示没有flyway_schema_history 表时,仅接受空库。

四、SpringBoot中Flyway的配置

spring已经给定了一套默认值,一般不需要进行单独配置,如需修改的可参照一下进行

# flyway 配置
spring:flyway:# 启用或禁用 flywayenabled: true# flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这个默认值是 false 理论上作为默认配置是不科学的。clean-disabled: true# SQL 脚本的目录,多个路径使用逗号分隔 默认值 classpath:db/migrationlocations: classpath:db/migration#  metadata 版本控制信息表 默认 flyway_schema_historytable: flyway_schema_history# 如果没有 flyway_schema_history 这个 metadata 表, 在执行 flyway migrate 命令之前, 必须先执行 flyway baseline 命令# 设置为 true 后 flyway 将在需要 baseline 的时候, 自动执行一次 baseline。baseline-on-migrate: true# 指定 baseline 的版本号,默认值为 1, 低于该版本号的 SQL 文件, migrate 时会被忽略baseline-version: 1# 字符编码 默认 UTF-8encoding: UTF-8out-of-order: false# 需要 flyway 管控的 schema list,这里我们配置为flyway  缺省的话, 使用spring.datasource.url 配置的那个 schema,# 可以指定多个schema, 但仅会在第一个schema下建立 metadata 表, 也仅在第一个schema应用migration sql 脚本.# 但flyway Clean 命令会依次在这些schema下都执行一遍. 所以 确保生产 spring.flyway.clean-disabled 为 trueschemas: tests# 执行迁移时是否自动调用验证  validate-on-migrate: true

五、基线迁移

在实际使用过程中,数据库的更新脚本可能会越来越多,这个时候,当我们要部署新环境时,就需要从头把所有脚本都执行一边,太耗时间,为解决此问题,flyway引入基线迁移。创建基线迁移脚本
B<version>__<description>.sql
示例:B2.0.1__20240516.sql
在原来环境中基线脚本会被忽略,在新环境中基线脚本才起作用,即当没有flyway_schema_history表时,会找到最新的基线脚本,即版本号最大的,执行该脚本,并顺序执行版本号大于基线版本的其他迁移脚本。

相关文章:

Flyway SpringBoot中使用

Flyway 一、 介绍 通过版本化数据库&#xff0c;提高数据库迁移的可靠性。即启动项目时就按版本执行sql脚本&#xff0c;实现数据库自动迁移。 Flyway是一款开源的数据库版本管理工具&#xff0c;它能够实现数据库迁移和版本控制。Flyway通过SQL脚本或Java代码进行数据库变更…...

全志A133 Android10 lcd配置显示硬件参数说明

一&#xff0c;概述 全志平台&#xff0c;通过board.dts来配置一些通用的 LCD 配置参数。 内核板级配置&#xff1a; longan/device/config/chips/a133/configs/b6/board.dts二&#xff0c;硬件参数说明 1. lcd接口参数说明 lcd_driver_name Lcd 屏驱动的名字&#xff08;字…...

景源畅信:小白做抖音运营难吗?

在数字化时代&#xff0c;社交媒体已成为人们生活的一部分&#xff0c;而抖音作为其中的翘楚&#xff0c;吸引了众多希望通过平台实现自我价值和商业目标的用户。对于刚入门的小白来说&#xff0c;运营抖音账号可能会遇到不少挑战。接下来&#xff0c;我们将详细探讨这一话题&a…...

初探 Spring Boot Starter Security:构建更安全的Spring Boot应用

引言 Spring Boot 作为 Java 生态系统下的热门框架&#xff0c;以其简洁和易上手著称。而在构建 Web 应用程序时&#xff0c;安全性始终是开发者必须重视的一个方面。Spring Boot Starter Security 为开发者提供了一个简单但功能强大的安全框架&#xff0c;使得实现身份验证和…...

【无标题】思科交换路由中路由引入实验指南

路由引入是网络设计中的一个重要概念&#xff0c;它允许不同路由协议之间的路由信息交换。在思科网络设备中&#xff0c;路由引入可以增强网络的连通性和效率。本文将介绍路由引入的基本概念&#xff0c;并通过一个实验来演示如何在思科路由器中实现路由引入。 ## 路由引入的基…...

基于yolov2深度学习网络的昆虫检测算法matlab仿真,并输出昆虫数量和大小判决

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022A 3.部分核心程序 .......................................................... for i 1:12 % 遍历结…...

Java进阶学习笔记2——static

static&#xff1a; 叫静态&#xff0c;可以修饰成员变量、成员方法。 成员变量按照有无static修饰&#xff0c;分为两种&#xff1a; 类变量&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机中只有一份&#xff0c;会被类的全部对象共享。静态成员变量。 实…...

spring boot集成Knife4j

文章目录 一、Knife4j是什么&#xff1f;二、使用步骤1.引入依赖2.新增相关的配置类3.添加配置信息4.新建测试类5. 启动项目 三、其他版本集成时常见异常1. Failed to start bean ‘documentationPluginsBootstrapper2.访问地址后报404 一、Knife4j是什么&#xff1f; 前言&…...

redis核心面试题一(架构原理+RDB+AOF)

文章目录 0. redis与mysql区别1. redis是单线程架构还是多线程架构2. redis单线程为什么这么快3. redis过期key删除策略4. redis主从复制架构原理5. redis哨兵模式架构原理6. redis高可用集群架构原理7. redis持久化之RDB8. redis持久化之AOF9. redis持久化之混合持久化 0. red…...

STM32F1之SPI通信·软件SPI代码编写

目录 1. 简介 2. 硬件电路 移位示意图 3. SPI时序基本单元 3.1 起始条件 3.2 终止条件 3.3 交换一个字节&#xff08;模式0&#xff09; 3.4 交换一个字节&#xff08;模式1&#xff09; 3.5 交换一个字节&#xff08;模式2&#xff09; 3.6 交换一个字节&a…...

实战:生成个性化词云的Python实践【7个案例】

文本挖掘与可视化&#xff1a;生成个性化词云的Python实践【7个案例】 词云&#xff08;Word Cloud&#xff09;&#xff0c;又称为文字云或标签云&#xff0c;是一种用于文本数据可视化的技术&#xff0c;通过不同大小、颜色和字体展示文本中单词的出现频率或重要性。在词云中…...

云存储与云计算详解

1. 云存储与云计算概述 1.1 云存储 云存储&#xff08;Cloud Storage&#xff09;是指通过互联网将数据存储在远程服务器上&#xff0c;用户可以随时随地访问和管理这些数据。云存储的优点包括高可扩展性、灵活性和成本效益。 1.2 云计算 云计算&#xff08;Cloud Computin…...

【飞舞的花瓣】飞舞的花瓣代码||樱花代码||表白代码(完整代码)

关注微信公众号「ClassmateJie」有完整代码以及更多惊喜等待你的发现。 简介/效果展示 这段代码是一个HTML页面&#xff0c;其中包含一个canvas元素和相关的JavaScript代码。这个页面创建了一个飘落花瓣的动画效果。 代码【获取完整代码关注微信公众号「ClassmateJie」回复“…...

网络安全的重要组成部分:数据库审计

数据库审计&#xff08;简称DBAudit&#xff09;以安全事件为中心&#xff0c;以全面审计和精确审计为基础&#xff0c;实时记录网络上的数据库活动&#xff0c;对数据库操作进行细粒度审计的合规性管理&#xff0c;对数据库遭受到的风险行为进行实时告警。它通过对用户访问数据…...

gc和gccgo编译器

Go 语言有两个主要的编译器&#xff0c;分别是 Go 编译器&#xff08;通常简称为 gc&#xff09;和 GCCGO。它们之间有一些重要的异同点&#xff1a; gc 编译器&#xff1a; gc 是 Go 语言的官方编译器&#xff0c;由 Go 语言的开发团队维护。它是 Go 语言最常用的编译器&#…...

开放重定向漏洞

开放重定向漏洞 1.开放重定向漏洞概述2.攻击场景&#xff1a;开放重定向上传 svg 文件3.常见的注入参数 1.开放重定向漏洞概述 开放重定向漏洞&#xff08;Open Redirect&#xff09;是指Web应用程序接受用户提供的输入&#xff08;通常是URL参数&#xff09;&#xff0c;并将…...

基于YoloV4汽车多目标跟踪计数

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着城市交通的快速发展&#xff0c;交通流量和车辆密度的不断增加&#xff0c;对交通管理和控…...

交叉编译程序,提示 incomplete type “struct sigaction“ is not allowed

问题描述 incomplete type "struct sigaction" is not allowed解决办法 在代码的最顶端添加如下代码即可 #define _XOPEN_SOURCE此定义不是简单的宏定义&#xff0c;是使程序符合系统环境的不可缺少的部分 _XOPEN_SOURCE为了实现XPG&#xff1a;The X/Open Porta…...

叶面积指数(LAI)数据、NPP数据、GPP数据、植被覆盖度数据获取

引言 多种卫星遥感数据反演叶面积指数&#xff08;LAI&#xff09;产品是地理遥感生态网推出的生态环境类数据产品之一。产品包括2000-2009年逐8天数据&#xff0c;值域是-100-689之间&#xff0c;数据类型为32bit整型。该产品经过遥感数据获取、计算归一化植被指数、解译植被类…...

光环P3O不错的一个讲座

光环P3O不错的一个讲座&#xff0c;地址&#xff1a;https://apphfuydjku5721.h5.xiaoeknow.com/v2/course/alive/l_663dc840e4b0694c62c32d1d?app_idapphfuydJkU5721&share_fromu_5c987304d8515_wH2E5HgCgx&share_type5&share_user_idu_5c987304d8515_wH2E5HgCgx…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技

无需布线的革命&#xff1a;电力载波技术赋能楼宇自控系统 在楼宇自动化领域&#xff0c;传统控制系统依赖复杂的专用通信线路&#xff0c;不仅施工成本高昂&#xff0c;后期维护和扩展也极为不便。电力载波技术&#xff08;PLC&#xff09;的突破性应用&#xff0c;彻底改变了…...

第22节 Node.js JXcore 打包

Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本&#xff0c;基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...