02. Springboot集成Flyway

news2024/12/22 20:32:26

目录

1、前言

2、什么是Flyway?

3、为什么要使用 Flyway?

4、简单示例

4.1、创建Spring Boot工程

4.2、添加Flyway依赖

4.3、Springboot添加Flyway配置

4.4、创建执行SQL脚本

4.5、启动测试

4.6、Flyway版本管理

5、SQL脚本文件命名规则

6、使用注意事项


1、前言

在现代应用程序开发中,数据库的变化是一个不可避免的过程。为了管理数据库版本、维护迁移历史记录和确保开发团队之间的一致性,Flyway 是一个强大的数据库迁移工具,而与 Spring Boot 集成可以让我们更轻松地进行数据库版本管理。

2、什么是Flyway?

Flyway 是一个开源的数据库迁移工具,它允许开发人员轻松地管理数据库的结构变化。通过使用 Flyway,您可以跟踪数据库架构的版本,并自动执行升级、回滚和迁移操作。Flyway 的核心思想是将数据库迁移脚本与应用程序代码分开,确保数据库的演进可以与代码的演进分开管理。

官网地址:Homepage - Flyway

3、为什么要使用 Flyway?

为了更好地理解为什么要使用 Flyway,让我们看一下一些使用 Flyway 的主要优势:

  1. 版本控制:Flyway 允许您将数据库架构的变化纳入版本控制系统中,就像您对应用程序代码做的那样。这样,您可以轻松跟踪数据库变化的历史记录,并在需要时进行回滚。
  2. 协作:当多个开发人员共同工作在一个项目中时,Flyway 可以确保每个人都使用相同的数据库架构。这有助于避免由于数据库不一致而引发的问题。
  3. 自动化:Flyway 提供了自动执行数据库迁移脚本的功能。这意味着您不需要手动运行 SQL 脚本来更新数据库,Flyway 会在应用程序启动时自动检测并执行必要的迁移。
  4. 回滚:如果出现问题,Flyway 允许您回滚到先前的数据库版本,从而避免了可能的数据丢失或破坏。

4、简单示例

4.1、创建Spring Boot工程

创建demo工程springboot-flyway,并集成好基本的springboot环境。

4.2、添加Flyway依赖

里需要注意MySQL版本,我这边安装的是MySQL5.7,所以flyway支持的最高版本为7.15.0。其他版本的对应关系为:

Flyway 8.x 和 MySQL 版本支持:

  • Flyway 8.x 版本通常支持 MySQL 8 和更高版本。

Flyway 7.x 和 MySQL 版本支持:

  • Flyway 7.x 版本通常支持 MySQL 5.7 和更高版本。
  • Flyway 7.0.0 引入了对 MySQL 8.0 JSON 数据类型的支持。

Flyway 6.x 和 MySQL 版本支持:

  • Flyway 6.x 版本支持 MySQL 5.7 和更高版本。

Flyway 5.x 和 MySQL 版本支持:

  • Flyway 5.x 版本支持 MySQL 5.1 以上的版本。
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>7.15.0</version>
</dependency>

4.3、Springboot添加Flyway配置

spring:
  datasource:
    dynamic:
      primary: primary
      # mysql数据源配置
      datasource:
        primary:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/flyway-demo?useUnicode=true&characterEncoding=utf8&useSSL=false
          username: root
          password: root
  flyway:
    # 是否开启flyway
    enabled: true
    encoding: utf-8
    # 默认存放sql脚本目录,默认为db/migration
    locations: classpath:db/migration
    # sql脚本文件名前缀,默认大写V
    sql-migration-prefix: V
    # sql脚本文件名称的分隔符,默认2个下划线__
    sql-migration-separator: __
    # 迁移sql脚本文件名称的后缀
    sql-migration-suffixes: .sql
    # metadata 版本控制信息表 默认 flyway_schema_history
    table: flyway_schema_history
    # 指定 baseline 的版本号,默认值为 1, 低于该版本号的 SQL 文件, migrate 时会被忽略
    baseline-version: 1

4.4、创建执行SQL脚本

在resources下创建db/migration目录。并创建执行MySQL脚本文件:

创建V1.0.0__create_user.sql:

CREATE TABLE IF NOT EXISTS `user`
(
    `USER_ID`      INT          NOT NULL AUTO_INCREMENT,
    `USER_NAME`    VARCHAR(100) NOT NULL COMMENT '用户姓名',
    `AGE`          INT          NOT NULL COMMENT '年龄',
    `CREATED_TIME` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `CREATED_BY`   varchar(100) NOT NULL DEFAULT 'UNKNOWN',
    `UPDATED_TIME` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `UPDATED_BY`   varchar(100) NOT NULL DEFAULT 'UNKNOWN',
    PRIMARY KEY (`USER_ID`)
    ) ENGINE = InnoDB
    DEFAULT CHARSET = utf8mb4;

创建V1.0.0__create_role.sql:

CREATE TABLE IF NOT EXISTS `role`
(
    `ROLE_ID`      INT          NOT NULL AUTO_INCREMENT,
    `ROLE_NAME`    VARCHAR(100) NOT NULL COMMENT '角色姓名',
    `CREATED_TIME` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `CREATED_BY`   varchar(100) NOT NULL DEFAULT 'UNKNOWN',
    `UPDATED_TIME` datetime     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `UPDATED_BY`   varchar(100) NOT NULL DEFAULT 'UNKNOWN',
    PRIMARY KEY (`ROLE_ID`)
    ) ENGINE = InnoDB
    DEFAULT CHARSET = utf8mb4;

4.5、启动测试

可以看到flyway-demo数据库已经成功执行了脚本文件。

查看MySQL,表已经成功创建。

4.6、Flyway版本管理

除了我们创建的role和user表以外,还有flyway_schema_history表。这个是用于记录数据库迁移的历史记录和状态信息。这个表的存在是为了跟踪和管理数据库的版本控制,以确保数据库的迁移和结构变更是可管理的和可追溯的。打开可以看到我们所执行的变迁脚本记录:

通过维护 flyway_schema_history 表,Flyway 可以在应用程序启动时检查数据库的当前状态,并确定需要应用的新迁移脚本。如果有新的脚本需要应用,Flyway 将自动执行这些脚本,确保数据库的结构与应用程序的版本保持一致。

5、SQL脚本文件命名规则

执行方式+版本号__sql名称.sql脚本后缀
---//例子:
V1.0.0__create_table.sql
  1. 以 V 开头的,仅执行一次。通常用于DDL表结构操作。V+版本后(版本号间的数字以“.” 或者“ _ ”分隔开,“ _ ”会自动编译成 “ . ” )+" __"+文件描述+后缀名。例如:V1.0.0__create_user.sql。
  2. 以 R 开头的,可以执行多次。如R__optimazed_user.sql。
  3. V开头的脚本文件,执行优先级一定比R的高。
  4. 版本号以最左对齐原则,如:
    1. 1.0.1比1.0.0版本高。
    2. 1.0.1.1比1.0.1版本高。
    3. 1.10.0比1.9.9版本高。

6、使用注意事项

  1. 迁移脚本命名规则:Flyway 依赖于迁移脚本的命名规则,通常是以版本号开头,后跟双下划线和描述性名称,例如 V1__create_table.sql。版本号用于确定脚本的执行顺序。
  2. 不要修改已应用的迁移脚本: 一旦迁移脚本被应用,不应修改它们。如果需要更改数据库结构,应创建一个新的迁移脚本来处理变化。
  3. 备份和回滚策略: 在进行数据库迁移之前,务必备份数据库以防止意外情况。Flyway 支持回滚到先前的版本,但仍然建议在生产环境中小心谨慎。
  4. 多环境配置: 使用 Spring Boot 配置文件来为不同的环境(开发、测试、生产)提供不同的数据库连接信息和 Flyway 配置。
  5. 监控和日志:配置适当的监控和日志记录以跟踪迁移的执行情况,以及处理可能出现的错误。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

比特币 ZK 赏金系列:第 2 部分——查找哈希冲突

在我们的零知识赏金 (ZKB) 系列的第二部分中&#xff0c;我们将其应用于解决哈希冲突难题。在这样的谜题中&#xff0c;两个不同的输入散列到相同的输出。此类赏金可用于&#xff1a; 充当煤矿中的金丝雀&#xff0c;给我们一个有价值的提醒。存在冲突是散列函数较弱的标志&…

LCP 06. 拿硬币【向上取整】

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;贪心 知识回顾向上、向下取整 写在最后 Tag 【贪心】【数组】 题目来源 LCP 06. 拿硬币 题目解读 数组 coins 中存放的是一堆堆的力扣币&#xff0c;对于每一堆力扣币&#xff0c;你可以选择拿走一枚或者两枚&#x…

SOCKS5 认证的方法

在进行网络浏览或爬虫等相关工作时&#xff0c;我们经常会遇到需要使用 SOCKS5 代理认证的情况。然而&#xff0c;某些浏览器可能不提供原生支持 SOCKS5 代理认证的选项&#xff0c;给我们带来了一些困扰。本文将为大家介绍几种解决浏览器不支持 SOCKS5 代理认证问题的方法。 …

java图形化工具编写初试

java图形化工具编写初试 前言&#xff1a; 照虎画猫——用WgpSec 说书人师傅的‘用友NC系列检测利用工具’结合本人为数不多的java基础再结合gpt&#xff0c;学习了一下java图形化工具的编写&#xff0c;实现了最基础的漏洞检测功能........用大华的两个漏洞为例&#xff0c;分…

kafka消费/发送消息,消息过大报错解决whose size is larger than the fetch size 1048576

目录 一、kafka消费报错原因二、解决方案1、原因一的解决方案2、原因二的解决方案 一、kafka消费报错原因 问题原因一&#xff1a;个是kafka本身的配置没有调整到上限 问题原因二&#xff1a;就是我们自己写python消费kafka代码的时候没有参数配置没有限制 RecordTooLargeE…

实践分享:vue模块化基本用法

首先还是来看看什么是模块化。 常见的概括&#xff1a;模块化就是把单独的一个功能封装到一个模块&#xff08;文件&#xff09;中&#xff0c;模块之间相互隔离&#xff0c;但是可以通过特定的接口公开内部成员&#xff0c;也可以依赖别的模块&#xff08;方便代码的重用&…

Zotero配合dblp文献库免费一键下载文献及管理教程

Zotero配合dblp文献库免费一键下载文献及管理教程 1 dblp计算机科学文献库2 文献导入到Zotero教程参考&#xff1a; 在这里&#xff0c;相信大家都已经知道Zotero这个强大的文献管理软件了&#xff0c;它可以多端同步&#xff0c;自动下载文献&#xff0c;自定义标签&#xff0…

数据结构——排序算法——归并排序

将两个有序数组合并为一个有序数组 在第二个列表向第一个列表逐个插入的过程中&#xff0c;由于第二个列表已经有序&#xff0c;所以后续插入的元素一定不会在前面插入的元素之前。在逐个插入的过程中&#xff0c;每次插入时&#xff0c;只需要从上次插入的位置开始&#xff0…

Pytorch从零开始实战04

Pytorch从零开始实战——猴痘病识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——猴痘病识别环境准备数据集模型选择模型训练数据可视化其他模型图片预测 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytor…

mysql用事务实现更新数据

前言&#xff1a;在手动批量更新正式环境数据库时&#xff0c;建议使用事物进行更新&#xff0c;避免更错数据&#xff0c;造成不必要的麻烦。 现表中有三条数据&#xff0c;使用事物批量将name字段为mgx&#xff0c;phone字段为17837107346&#xff0c;所有数据中的address字段…

华为云云耀云服务器L实例评测|服务器反挖矿防护指南

前言 本文为华为云云耀云服务器L实例测评文章&#xff0c;测评内容是 云耀云服务器L实例 反挖矿防护指南 系统配置&#xff1a;2核2G 3M CentOS7.9 之前的文章中『一文教你如何防御数据库恶意攻击』&#xff0c;我们讲到黑客如何通过攻击数据库来获取权限&#xff0c;以及我们…

别再纠结线程池池大小、线程数量了,哪有什么固定公式 | 京东云技术团队

可能很多人都看到过一个线程数设置的理论&#xff1a; CPU 密集型的程序 - 核心数 1 I/O 密集型的程序 - 核心数 * 2 不会吧&#xff0c;不会吧&#xff0c;真的有人按照这个理论规划线程数&#xff1f; 线程数和CPU利用率的小测试 抛开一些操作系统&#xff0c;计算机原…

C++数据结构X篇_14_二叉树的递归遍历(先序遍历、中序遍历、后续遍历方法介绍;举例;代码实现)

我们知道数据的存储结构分为线性与非线性。线性就是1对1的结构&#xff0c;像栈与队列都属于线性结构。那什么是非线性的结构呢&#xff1f; 非线性即1对n的结构这更符合常规情况&#xff0c;线性结构本质上属于非线性结构中的一种特殊形式&#xff0c;像树就属于非线性结构。但…

iOS 17 Simulator Failed with HTTP status 400:bad request

升级 xcode 15 要 ios17 的 sdk 才能运行&#xff0c;但是更新这个 sdk 400 错误了 解决方案&#xff1a; 直接去官网下载开发者后台下载dmg文件&#xff0c;使用命令行快速安装即可 https://developer.apple.com/documentation/xcode/installing-additional-simulator-runti…

Anaconda和Pycharm详细安装 配置教程

Anaconda&#xff1a;是一个开源的Python发行版本&#xff0c;其中包含了conda、Python等180多个科学包及其依赖项。【Anaconda下载】 PyCharm&#xff1a;PyCharm是一种Python IDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。【PyCharm下载】…

功能强大的PostgreSQL没有MySQL流行的10个原因,你知道几个?

以下内容是根据玖章算术CEO叶正盛在「3306π 数据库朋友圈」技术演讲整理。文末附完整的PPT下载链接&#xff01; MySQL与PostgreSQL都是非常优秀并且非常成功的数据库&#xff0c;PostgreSQL的功能比MySQL强大&#xff0c;但是依然没有MySQL流行&#xff0c;作者从产品功能、…

Vue3中的computed函数详解

计算属性是Vue中常用的一种方式&#xff0c;主要用于在模板中放置逻辑计算&#xff0c;方便开发者进行数据操作和展示。在Vue3中&#xff0c;计算属性依然是非常重要的一种功能&#xff0c;而computed函数则更加的方便计算属性的使用。本文将对Vue3中的computed函数进行详细的介…

terraform简单的开始-vpc cvm创建

从网络开始 从创建VPC开始 复用前面的main.tf的代码&#xff1a; terraform {required_providers {tencentcloud {source "tencentcloudstack/tencentcloud"version "1.81.25"}} } variable "region" {description "腾讯云地域"…

西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(二)

西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(二) 上一次和大家分享了组态相关的重要内容,具体可以参考以下链接中的内容: 西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(一) 本次继续和大家分享关于安全PLC基础编程的相关内容: 如下图所示,在左侧的…

开通经营收款码要手续费吗

我们都知道&#xff0c;目前市场上的支付宝或者微信商户收款&#xff0c;无论是线上收款还是实体店收款&#xff0c;一般都采用0.6%的收款费率&#xff0c;1万元就是60元。 其实这不低的。 大多数线下实体店商家可能使用的聚合支付码可能是0.38%&#xff0c;1万元是38。 虽然不…