springboot 3 + mysql8 + flyway 数据库版本管理

news2024/10/2 14:33:46

1、flyway

flyway官方文档地址:https://documentation.red-gate.com/fd
对于不怎么看文档的我来说:
1)flyway是个管理数据库版本的工具,可以对不同环境的sql进行迁移操作。
2)优点:初始化、后期数据的管理、变更等,个人认为锦上添花的是一件执行数据脚本,方便快捷
对于数据库每当发布时会出现手动执行sql脚本进行升级数据库,中间经常出现一些漏写、错写情况,对数据库的版本与代码的版本不匹配,

2、文件命名规则

在这里插入图片描述
前缀:
V 代表版本变迁(Versioned Migrations),
U 代表撤销变迁(Undo Migrations),
R 代表可重复变迁(Repeatable Migrations),一般为可重复执行的sql语句。
版本号: 唯一的版本号,比如V1.0.1
分隔符: __ (两个下划线)
描述信息: 描述信息
后缀: .sql
== 其中,V开头的SQL执行优先级要比R开头的SQL优先级高==

命名eg:
V1__insert.sql

3、版本号

- 0.0.1.10.0.1- 0.0.100.0.010 一样高

4、Springboot集成Flyway

4.1 pom


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>


    <!--引入 Spring Boot Starter 父工程: -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.flyway</groupId>
    <artifactId>flyway</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--跳过测试类打包-->
        <skipTests>true</skipTests>

        <!-- spring-boot & spring cloud & alibaba -->
        <spring-boot.version>3.2.0</spring-boot.version>
        <spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
        <spring-cloud.version>2023.0.0</spring-cloud.version>

    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- mysql数据库 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.32</version>
        </dependency>

        <!--导入MP包之后,删除原有的Mybatis的包 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.5.4.1</version>
        </dependency>

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

        <!--必须同时引入flyway-mysql,否则会报不支持mysql8.1版本数据库。 -->
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-mysql</artifactId>
            <version>9.22.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>8.0.4</version>
                <configuration>
                    <url> 数据库地址</url>
                    <user>数据库用户名</user>
                    <password>密码</password>
                    <driver>com.mysql.cj.jdbc.Driver</driver>
                </configuration>
            </plugin>
        </plugins>
    </build>


</project>

4.2 application.yml

spring:
  # 数据库配置
  datasource:
    url:  
    username:  
    password:  
    driver-class-name: com.mysql.cj.jdbc.Driver

  flyway:
    # 开启数据库脚本备份
    enabled: true
    # 默认1,从0开始可以规避版本1不执行问题
    baseline-version: 0
    # flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这个默认值是 false 理论上作为默认配置是不科学的。
    clean-disabled: false
    # SQL 脚本的目录,多个路径使用逗号分隔 默认值 classpath:db/migration
    locations: classpath:db/migration
    #是否允许无序的迁移,默认false
    out-of-order: false
    #编码
    encoding: UTF-8
    # 执行迁移时是否自动调用验证   当你的 版本不符合逻辑 比如 你先执行了 DML 而没有 对应的DDL 会抛出异常
    validate-on-migrate: true
    # 设置为true,当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
    baselineOnMigrate: true

4.3 启动项 SpringbootFlywayApplication

package com.Flyway

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootFlywayApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootFlywayApplication.class, args);
    }

}

4.4 操作方式

4.4.1 启动springboot项目

在这里插入图片描述

4.4.3 插件启动

在这里插入图片描述

4.5 数据查看

在这里插入图片描述

5、注意事项

  1. 报错后需要删除flyway_schema_history中记录,否则启动失败;
  2. V文件的优先级高于R,假如三个V迁移脚本和一个R(无论新建还是修改)一起执行,其中一个V报错,则V会全部执行完成且记录到flyway_schema_history中,而R不执行且不记录,删除表中报错记录后,重新启动,则执行原错误V和未执行的R;
  3. 多个要执行的R中,如果出现了其中一个出现了错误,则在其后的R都不执行 R的执行顺序根据命名来进行排序;
  4. 一个文件中ddl并不由一个事务管理,比如创建三个表,中间创建表语句报错,则第一个表还是会创建成功并且提交事务;
  5. 同一个迁移文件下假设都是DML(即insert、delete、update),那么如果中间出现错误,所有的DML语句都会回滚;
  6. 已经执行过的迁移文件(V)不能修改,否则启动报错 版本号相同会报错(Found more than one migration with version ****);
  7. 删除sql文件后启动会报错

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

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

相关文章

dpdk网络转发环境的搭建

文章目录 前言ip命令的使用配置dpdk-basicfwd需要的网络结构测试dpdk-basicfwddpdk-basicfwd代码分析附录basicfwd在tcp转发时的失败抓包信息DPDK的相关设置 前言 上手dpdk有两难。其一为环境搭建。被绑定之后的网卡没有IP&#xff0c;我如何给它发送数据呢&#xff1f;当然&a…

动物免疫(羊驼免疫)-泰克生物

在过去几十年里&#xff0c;抗体研究和应用的领域已经经历了革命性的变化。在这个进程中&#xff0c;一种特殊来源的抗体 —— 来自骆驼科动物&#xff08;包括羊驼&#xff09;的单链抗体&#xff08;也称纳米抗体&#xff09;引起了全球科学家的广泛关注。 羊驼等骆驼科动物…

vectorCast添加边界值分析测试用例

1.1创建项目成功后会自动生成封装好的函数,在这些封装好的函数上点击右键,添加边界值分析测试用例,如下图所示。 1.2生成的用例模版是不可以直接运行的,需要我们分别点击它们,让它们自动生成相应测试用例。如下图所示,分别为变化前和变化后。 1.3点击选中生成的测试用例,…

家庭教育小知识青春期孩子如何教育?

孩子进入青春期后&#xff0c;很多家长都纷纷感叹&#xff0c;与孩子相处太难了。那个曾经乖巧、黏人的孩子&#xff0c;好像一夜之间浑身长满刺&#xff0c;变得叛逆、敏感、暴躁、将父母拒之门外、甚至是辱骂、羞辱父母。 让父母更挫败的是&#xff0c;曾经通过说教、讲道理…

sqlmap使用教程(1)

一、sqlmap简介 sqlmap是一个自动化SQL注入测试工具&#xff0c;它支持的数据库有MySQL、MSSQL、Oracle、PostgreSQL、Access、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB。sqlmap默认使用以下5种SQL注入技术&#xff1a; 基于布尔的盲注&#xff1a;根据返回页面判断条件…

flink基本概念

1. Flink关键组件: 这里首先要说明一下“客户端”。其实客户端并不是处理系统的一部分&#xff0c;它只负责作业的提交。具体来说&#xff0c;就是调用程序的 main 方法&#xff0c;将代码转换成“数据流图”&#xff08;Dataflow Graph&#xff09;&#xff0c;并最终生成作业…

Kotlin 尾递归函数

函数式编程中&#xff0c;重要的概念 尾递归&#xff1a; 当一个函数 在最后调用 自身&#xff0c;称为 尾递归&#xff0c;是一种特殊的递归函数。 Kotlin 使用 tailrec 声明尾递归函数&#xff0c;可以避免 StackOverflowError 的风险。 原理是&#xff1a;通过编译器优化 …

BACnet网关BL121BN 实现稳定可靠、低成本、简单的楼宇自控协议BACnet转OPC UA解决方案

随着楼宇自控系统的迅猛发展&#xff0c;人们深刻认识到在楼宇暖通行业中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于楼宇自控和暖通空调系统应用中。 钡铼技术…

Linux:动静态库的概念制作和底层工作原理

文章目录 动静态库基础认知动静态库基本概念静态库的制作库的概念包的概念 静态库的使用第三方库小结 动态库的制作动态库的使用动态库如何找到内容&#xff1f;小结 动态库加载库和程序都要加载可执行程序的地址问题地址问题逻辑地址和平坦模式绝对编址和相对编址与位置无关码…

Lombok工具包

Lombok已经集成springboot项目中因此在依赖中引入Lombok不需要指定版本号。 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId> </dependency> Lombok中各种注释的含义

51单片机电子密码锁Proteus仿真+程序+视频+报告

目录 视频 设计分析 系统结构 仿真图 资料内容 资料下载地址&#xff1a;51单片机电子密码锁Proteus仿真程序视频报告 视频 单片机电子密码锁Proteus仿真程序视频 设计分析 (1)能够从键盘中输入密码&#xff0c;并相应地在显示器上显示‘*’&#xff1b; (2)能够判断密码…

什么是碳结算电能表?

引言 近年来&#xff0c;我国加速推进碳达峰碳中和标准计量体系建设&#xff0c;但随着各地区、各领域、各行业对碳排放核算数据的需求显著提升&#xff0c;当前碳排放核算体系数据更新偏慢、核算口径不一、基础排放因子滞后等一系列问题也开始凸显。新形势下对碳排放统计核算…

Android OpenGL EGL使用——自定义相机

如果要使用OpenGl来自定义相机&#xff0c;EGL还是需要了解下的。 可能大多数开发者使用过OpengGL但是不知道EGL是什么&#xff1f;EGL的作用是什么&#xff1f;这其实一点都不奇怪&#xff0c;因为Android中的GlSurfaceView已经将EGL环境都给配置好了&#xff0c;你一直在使用…

【机器学习】调配师:咖啡的完美预测

有一天&#xff0c;小明带着一脸期待找到了你这位数据分析大师。他掏出手机&#xff0c;屏幕上展示着一份详尽的Excel表格。“看&#xff0c;这是我咖啡店过去一年的数据。”他滑动着屏幕&#xff0c;“每个月的销售量、广告投入&#xff0c;还有当月的气温&#xff0c;我都记录…

踏上职业征程的第一步——选择理想城市迎接大学生求职新起点

概要&#x1f481;&#x1f3fb; "嘿&#xff0c;这个话题我早就想聊聊了。感觉现在好多同学在找工作时&#xff0c;签约和工作地点的选择都有点盲目。很少有人主动考虑自己喜欢哪个城市&#xff0c;所以我想说说这个。当然&#xff0c;纯属个人看法&#xff0c;大家随便吐…

模型的 PSI(Population Stability Index)

PSI&#xff08;Population Stability Index&#xff09;是一种用于评估两个数据集或时间点之间的分布变化的指标。它常用于监测模型在不同时间段或不同群体上的稳定性。PSI的计算基于两个分布的累积分布函数&#xff08;CDF&#xff09;之间的差异。 在模型监测和评估的背景下…

Django(九)

1. 用户登录-Cookie和Session 什么是cookie和session&#xff1f; 发送HTTP请求或者HTTPS请求(无状态&短连接) http://127.0.0.1:8000/admin/list/ https://127.0.0.1:8000/admin/list/http无状态短连接&#xff1a;一次请求响应之后断开连接&#xff0c;再发请求重新连…

Keepalived实现nfs高可用

Keepalived实现nfs高可用 Nfs_master服务器&#xff1a;172.20.26.167 &#xff08;keepalived、nfs、sersync、rsync&#xff09; Nfs_salve服务器&#xff1a;172.20.26.198 &#xff08;keepalived、nfs、rsync&#xff09; Nfs_client服务器&#xff1a;172.20.26.24 …

LeetCode面试题05.06

美好的一天&#xff0c;从力扣开始 王子公主请看题 整数转换。编写一个函数&#xff0c;确定需要改变几个位才能将整数A转成整数B。 示例1: 输入&#xff1a;A 29 &#xff08;或者0b11101&#xff09;, B 15&#xff08;或者0b01111&#xff09;输出&#xff1a;2示例2: 输…

Python爬虫--5

1、异步爬虫 异步爬虫的方式&#xff1a; &#xff08;1&#xff09;多线程&#xff0c;多进程&#xff08;不建议使用&#xff09; 好处&#xff1a;可以为相关阻塞的操作单独开启线程或者进程&#xff0c;阻塞操作就可以异步执行。 弊端&#xff1a;无法无限制的开启多线程…