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的信息,可以直接访问官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28707.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

致远电子三合一8路串口服务器

ZLG致远电子全新推出国产化透传型三合一8路串口服务器&#xff0c;让用户轻松实现串口信号与以太网的无缝数据交互。性能强悍&#xff0c;等你来评&#xff0c;还有机会获得新年第一份心意&#xff01; GCOM88-2NET-P硬件速览 国产高性能816MHz处理器&#xff1b; 2路10/100M自…

20250304解决在飞凌的OK3588-C的Linux R4下解决使用gstreamer保存的mp4打不开

sync poweroff rootok3588:/# sync rootok3588:/# sync rootok3588:/# cd 107 rootok3588:/107# ls -l total 0 rootok3588:/107# sync rootok3588:/107# poweroff 20250304解决在飞凌的OK3588-C的Linux R4下解决使用gstreamer保存的mp4打不开 2025/3/4 10:58 缘起&#xff1a…

安路FPGA移植Cortex-M0内核

本文是关于基于安路FPGA EG4S20BG256移植Cortex M0内核的笔记。硬件平台使用硬木课堂的安路核心板&#xff0c;软件使用安路的TD5.6.2和keil5。&#xff08;博主刚学FPGA不久&#xff0c;文中有不足之处请帮忙指出&#xff09; 在移植之前&#xff0c;博主看了网上很多的文章、…

STM32——串口通信 UART

一、基础配置 Universal Asynchronous Receiver Transmitter 异步&#xff0c;串行&#xff0c;全双工 TTL电平 &#xff1a;高电平1 低电平0 帧格式&#xff1a; 起始位1bit 数据位8bit 校验位1bit 终止位1bit NVIC Settings一栏使能接受中断。 之前有设置LCD&#xff0c;…

flink集成tidb cdc

Flink TiDB CDC 详解 1. TiDB CDC 简介 1.1 TiDB CDC 的核心概念 TiDB CDC 是 TiDB 提供的变更数据捕获工具&#xff0c;能够实时捕获 TiDB 集群中的数据变更&#xff08;如 INSERT、UPDATE、DELETE 操作&#xff09;&#xff0c;并将这些变更以事件流的形式输出。TiDB CDC 的…

DeepSeek×博云AIOS:突破算力桎梏,开启AI普惠新纪元

背景 在全球人工智能技术高速迭代的背景下&#xff0c;算力成本高企、异构资源适配复杂、模型部署效率低下等问题&#xff0c;始终是制约企业AI规模化应用的关键。 DeepSeek以创新技术直击产业痛点&#xff0c;而博云先进算力管理平台AIOS的全面适配&#xff0c;则为这一技术…

ArcGIS Pro建库中常用公式的应用与技巧

在当今数字化的时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;在各个领域都发挥着至关重要的作用。 ArcGIS Pro作为一款功能强大的GIS软件&#xff0c;为用户提供了丰富的工具和功能&#xff0c;使得数据处理、地图制作和空间分析变得更加高效和便捷。 本文将为您…

C++入门基础

文章目录 C核心特性详解&#xff08;基础增强版&#xff09;一、第一个C程序&#xff1a;Hello World完整代码解析新手常见问题 二、命名空间&#xff08;详解版&#xff09;1. 为什么需要命名空间&#xff1f;2. 命名空间使用场景3. 嵌套命名空间4. 匿名命名空间 三、输入输出…

探秘基带算法:从原理到5G时代的通信变革【三】Turbo 编解码

文章目录 2.2 Turbo 编解码2.2.1 基本概念与系统构成2.2.2 编码过程分步解析交织器递归系统卷积编码器复接器总结 2.2.3 译码算法分类与原理Turbo码的强大主要来源于其解码器理论基础解码过程详解交织与解交织译码算法总结 2.2.4 Turbo码的应用场景无线通信卫星通信深空通信 2.…

一键无损放大视频,让老旧画面重焕新生!

打工人们你们好&#xff01;这里是摸鱼 特供版~ 嘿&#xff0c;朋友们&#xff01;在数字时代&#xff0c;视频已经成为我们生活中不可或缺的一部分。无论是珍贵的家庭录像&#xff0c;还是老旧的影视素材&#xff0c;我们都希望能以高清画质重温那些美好瞬间。但很多时候&…

build gcc

1&#xff0c;下载源码 wget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-4.1.0.tar.bz2 wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 wget https://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.2.1.tar.gz git clone --mirror https://github…

《用Python+PyGame开发双人生存游戏!源码解析+完整开发思路分享》

导语​ "你是否想过用Python开发一款可玩性高的双人合作游戏&#xff1f;本文将分享如何从零开始实现一款类《吸血鬼幸存者》的生存射击游戏&#xff01;包含完整源码解析、角色系统设计、敌人AI逻辑等核心技术点&#xff0c;文末提供完整代码包下载&#xff01;" 哈…

AutoGen学习笔记系列(一)Tutorial - Model

这个系列文章记录了学习微软 AutoGen 的过程&#xff0c;与 smolagents 学习笔记系列一样&#xff0c;仍然以官方教程自己的理解为主线&#xff0c;中间可能穿插几个番外支线的形式写博客。 【注意】&#xff1a;在阅读这篇文章之前需要确保已经按照其 Installation 小节完成必…

探秘基带算法:从原理到5G时代的通信变革【八】QAM 调制 / 解调

文章目录 2.7 QAM 调制 / 解调2.7.1 概述2.7.2 星座图星座图的结构与性能发射端的信息编码与接收端的解码差分编码的分类与实现差分编码的模4格雷加法器公式16QAM星座图与映射关系 2.7.3 信号表达式正交振幅调制的基本原理与系统分析相位误差对QAM性能的影响多电平正交振幅调制…

本地YARN集群部署

请先完成HDFS的前置部署&#xff0c;部署方式可查看:本地部署HDFS集群https://blog.csdn.net/m0_73641796/article/details/145998092?spm1001.2014.3001.5502 部署说明 组件配置文件启动进程备注Hadoop HDFS需修改 需启动: NameNode作为主节点 DataNode作为从节点 Secondary…

vivado 充分利用 IP 核

充分利用 IP 核 使用预先验证的 IP 核能够大幅减少设计和验证工作量&#xff0c;从而加速产品上市进程。如需了解更多有利用 IP 的信息&#xff0c;请参 阅以下资源&#xff1a; • 《 Vivado Design Suite 用户指南&#xff1a;采用 IP 进行设计》 (UG896) [ 参照 1…

Python-07PDF转Word

2025-03-04-PDF转Word DeepSeek等大模型从来都不是简单的写一个静态博客这么肤浅&#xff08;太多博主都只讲这个内容了&#xff09;借助全网大神的奇思妙想&#xff0c;拓展我狭隘的思维边界。 文章目录 2025-03-04-PDF转Word [toc]1-参考网址2-学习要点3-核心逻辑4-核心代码 …

android11使用gpio口控制led状态灯

目录 一、简介 二、解决方法 A、底层驱动 B、上层调用 C、验证 一、简介 1、需求&#xff1a;这里是用2个gpio口来控制LED灯&#xff0c;开机时默认亮蓝灯&#xff0c;按开机键&#xff0c;休眠亮红灯&#xff0c;唤醒亮蓝灯。 原理图&#xff1a; 这里由于主板上电阻R63…

el-input 设置类型为number时,输入中文后光标会上移,并且会出现上下箭头

光标上移 设置 el-input 的 typenumber后&#xff0c;只能输入数字&#xff0c;输入中文后会自动清空&#xff0c;但是会出现一个问题&#xff1a;【光标会上移&#xff0c;如下图】 解决方法&#xff1a;修改样式 注意&#xff1a;需要使用样式穿透 :deep( ) /*解决el-in…

el-table一格两行;概率;find

样式&#xff1a; 根据概率表头关键代码&#xff1a;rateRanges&#xff1b; scope.row.targetHitTable.find((target:any) > target.targetHitRate > range.min && target.targetHitRate < range.max)!.targetHitNum &#xff08;1&#xff09;!.是TypeScri…