SpringBoot项目集成liquibase,数据库版本控制解决方案

news2024/11/15 18:38:56

liquibase 数据库版本留痕解决方案,在实际生产过程中如何高效管理数据库的DDL与DML语句,对这些语句留痕处理。如果能将sql的执行与SpringBoot项目启动结合在一起,每次启动项目自动执行新增的sql语句,这样就可以使得项目组成员各个都保持相同的开发库,避免人为操作导致数据库不符合预期。

文章目录

    • 一,准备工作
    • 二,准备changelog-master
    • 三,准备changelog_init文件
    • 四,准备自己的changelog文件
    • 五,liquibase执行原理

一,准备工作

<!-- 首先引入liquibase依赖, 版本推荐4.5.0以上 -->
<dependency>
	<groupId>org.liquibase</groupId>
	<artifactId>liquibase-core</artifactId>
	<version>4.5.0</version>
</dependency>

<!-- 接着引入liquibase插件, 如果你的数据库已经有表和数据了可以使用该插件反向生成xml文件 -->
<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>3.5.1</version>
    <configuration>
        <propertyFile>src/main/resources/db/liquibase.properties</propertyFile>
        <propertyFileWillOverride>true</propertyFileWillOverride>
        <outputChangeLogFile>src/main/resources/liquibase/changelog/changelog_init.xml</outputChangeLogFile>
    </configuration>
</plugin>

outputChangeLogFile标签指定后续插件生成的脚本存放目录,插件中指定了一个src/main/resources/db/liquibase.properties的路径配置文件,配置文件内容如下:

# liquibase
changeLogFile=src/main/resources/liquibase/changelog-master.xml
# MySql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/reggie?characterEncoding=utf-8&serverTimezone=UTC
username=root
password=mysqlroot

二,准备changelog-master

​  根据自己喜好,在resources目录下创建changelog目录,也就是liquibase目录,推荐使用resources->db->changelog->changelog_init.xml这样的目录结构,我的目录结构如下:

image-20230118210756108

  changelog-master是整个liquibase的核心,SpringBoot项目启动的时候会自动去寻找这个文件,当然我们需要现在SpringBoot配置文件中启用liquibase

spring.liquibase.enabled=true
spring.liquibase.change-log=classpath:db/changelog-master.xml

​  有了master文件之后我们就可以把我们的sql文件写入或导入其中,或者指向另一个changelog的地址以区分不同的版本,目前我是指向了其他的changelog文件

<!-- changelog-master -->
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
            https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.5.xsd">
    <include file="classpath:db/changelog/changelog_init.xml"/>
    <include file="classpath:db/changelog/changelog_v1.0.xml"/>
</databaseChangeLog>

​  这样SpringBoot项目启动的时候就会去读取我的changelog-master文件,读取之后他会发现我这个文件引入了其他两个文件,他会按照先后顺序去读取这两个文件的内容,这样后续每一个大版本都可以用一个changelog来管理。

  如果启动报错,找不到指定文件,可以参考这篇博客:https://blog.csdn.net/zy_zhangruichen/article/details/128540204

三,准备changelog_init文件

​  前面说过如果我们的项目是中途想引入liquibase,数据库此时已经有了表和数据怎么办?那我们需要把数据库导出成liquibase能够识别的格式,然后作为xml文件交给liquibase,让其帮我们管理。

​  如果配置了第一步的插件,那我们直接点击idea右侧的maven,选择plugins,然后liquibase:generateChangeLog:

image-20230118211826776

​  那么liquibase就会自动帮我们生成一个初始化的文件,将这个文件作为changelog_init.xml交给liquibase管理即可,但这种生成的文件只包含DDL语句,并没有数据的INSERT语句,需要自己手动处理。

四,准备自己的changelog文件

​  开发过程中,如果有需要提交的DDL语句或DML语句,可以按版本规划先写一个changelog文件,接着在这个changelog文件中引入sql或直接在标签中填入sql:

<!-- changelog_v1.0.xml -->
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                   https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.5.xsd">
    <!--
    changeset:一个changelog可以包含多个changeset标签,每个changeset都由id、author、filepath属性唯一标识,
            当liquibase执行数据库changeLog时,他会按顺序读取changeSet,并针对每个changeSet检查databasechangelog表,
            已查看是否已经运行过id/author/filepath的组合,如果已运行且没有runAlways标签则会跳过该changeSet
        author:作者
        id:最好使用<项目名-时间戳>来命名区分
        runAlways:执行每次运行时设置的更改,即使之前已经运行过了
        context:灵活控制脚本在哪些环境中执行
    -->
    <changeSet id="reference-20230101-1400" author="y">
        <sqlFile path="../sql/mysql_init_data.sql" relativeToChangelogFile="true" />
    </changeSet>

    <changeSet id="reference-20230103-2122" author="y">
        <sqlFile path="../sql/mysql_dml_data_v1-1.sql" relativeToChangelogFile="true" />
    </changeSet>

    <changeSet id="reference-20230107-1951" author="y">
        <sqlFile path="../sql/mysql_ddl_data_v1-1.sql" relativeToChangelogFile="true" />
    </changeSet>

    <changeSet id="reference-20230107-1952" author="y">
        <sqlFile path="../sql/mysql_dml_data_v1-2.sql" relativeToChangelogFile="true" />
    </changeSet>

    <changeSet id="reference-20230107-2101" author="y">
        <sql>
            ALTER TABLE ticket MODIFY COLUMN `DATE` DATETIME;
        </sql>
    </changeSet>

    <changeSet id="reference-20230107-2257" author="y">
        <sql>
            ALTER TABLE ticket ADD COLUMN `createtime` DATETIME COMMENT '创建时间';
            ALTER TABLE ticket ADD COLUMN `updatetime` DATETIME COMMENT '更新时间';
        </sql>
    </changeSet>

    <changeSet id="reference-20230108-1245" author="y">
        <sql>
            ALTER TABLE ticket ADD COLUMN version INT(10) DEFAULT 1 COMMENT '版本号';
        </sql>
    </changeSet>

    <changeSet id="reference-20230108-1347" author="y">
        <sql>
            ALTER TABLE ticket ADD COLUMN isdeleted INT(1) DEFAULT 0 COMMENT '逻辑删除,0未删除,1已删除';
        </sql>
    </changeSet>
</databaseChangeLog>

五,liquibase执行原理

​  liquibase是怎么做到执行过的sql不再执行呢,其实在SpringBoot项目启动之后,它会在数据库中新增两张表,分别是DATABASECHANGELOGDATABASECHANGELOGLOCK,前面这张表会把我们的changelog文件执行记录都记录下来,并生成md5秘钥,每次启动的时候会判断md5值是否相等,所以sql文件一旦执行就不能修改了,而后面这张表是数据库分布式锁的解决方案。

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

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

相关文章

在 VMware Workstation 16 Pro 中安装 Ubuntu Server 22.04.1 并配置静态 IP 地址

文章目录1.下载 Ubuntu Server 22.04.12.新建虚拟机向导3.编辑虚拟机设置4.开启此虚拟机并配置Ubuntu系统5.设置 root 用户的密码6.允许远程连接 root 用户7.配置静态 IP 地址7.1 查看 Windows 的网络信息7.2 查看 Ubuntu 的网络信息7.3 修改配置文件7.4 测试 Windows 能否互相…

springcloud--xxl-job

xxl-job 虽然java自带定时器&#xff0c;但是在springcloud内&#xff0c;如果对多个模块进行统一任务调度&#xff0c;这是自带的定时器就显得不够用&#xff0c;这时就可以使用xxl-job。 xxl-job是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习…

智能门锁-手机应用相机国产、非国产统计参数对比分析

智能门锁-手机应用相机国产、非国产统计参数对比分析 智能门锁应用 从2019年1月1日至2020年12月31日&#xff0c;3D人脸识别智能门锁在全市场统计中&#xff0c;总销量已接近20万套。其中德施曼以其先发优势&#xff0c;良好的市场定位和大力度的推广&#xff0c;成为市场发展…

C语言萌新如何使用printf函数?

&#x1f40e;作者的话 如果你搜索输入输出函数&#xff0c;那么你会看到输入输出流、Turbo标准库、标准输出端、stdout什么什么乱七八糟的&#xff0c;作为一个萌新&#xff0c;哪懂这些&#xff1f; 本文介绍萌新在前期的学习中&#xff0c;常用的输入输出函数及其功能~ 跳跃…

【Python标准库】LZ77编码的基本原理和lzma模块

文章目录lz77编码lzma模块调用lz77编码 Python标准库总共提供了三种压缩算法&#xff0c;分别是zlib, bz2以及lzma&#xff0c;并且位这三个模块提供了高度相似的API&#xff0c;考虑到zlib中已经对很多定义做了详尽的解读&#xff0c;本文主要介绍一下lzma算法&#xff0c;然…

vue使用rem, vscode使用px to rem工具

一、使用px2rem-loader实现pxtorem 1、安装 首先&#xff0c;我们使用 vue 的脚手架 vue-cli 初始化一个 webpack 项目&#xff08;前提是已经安装过 vue-cli&#xff0c;具体不再阐述&#xff09;&#xff0c;一些选项根据自己项目需要选择。 vue init webpack my-app命令执…

深度学习算法数据-网络-算法总结

深度学习算法数据-网络-算法总结 1 数据集大全 通用2D检测数据集、交通标志、车道线、行人检测、3D目标检测、ReID等数据集 2 Backbone知识汇总 该部分主要是针对常见CNN结构以及ViT结构进行汇总&#xff0c;同时也包含轻量化CNN Backbone以及轻量化Transformer模型等高性…

详解pandas的read_excel函数

一、官网参数 pandas官网参数网址&#xff1a;pandas.read_excel — pandas 1.5.2 documentation 如下所示&#xff1a; 二、常用参数详解 1、io 一般指读取文件的路径。【必须指定】 import pandas as pddf pd.read_excel(r"C:\Users\wwb\Desktop\data3.xlsx")p…

chromecast激活

小白误入旁路由添加dns解析&#xff08;1&#xff09;外部网络设置不动&#xff0c;内部网络设置第一个dns服务器指向旁路由自己&#xff0c;第二个dns服务器用常用的保证能用就行&#xff08;2&#xff09;添加dns解析&#xff0c;把安卓ntp&#xff0c;更新时间的服务器链接成…

一文读懂CPU工作原理、程序是如何在单片机内执行的、指令格式之操作码地址码

文章较长,大家可选择性阅读,嘎嘎细 计算机结构 CPU的运行原理 CPU的控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里的)送到地址总线上去,然后CPU将这个地址里的指令读到指令寄存器进行译码。由运算器执行对应的机器指令,并将结果通过地…

如何用C++扩展NodeJS的能力?

文章目录前言C结合NodeJS的魅力C和NodeJS怎么结合通过Addon增强NodeJS环境的准备1. node-gyp2. nan (Native abstraction for NodeJS)编写Addon的C代码JS方法的C表示JS方法的传入参数 v8::Argument进阶进阶1: 输出一个JS包装类型进阶2: 使用多线程异步计算最后前言 Javascript…

Qt使用第三方库QXlsx将数据库的数据导出为Excel表格

一、参考和下载第三方库QXlsx 参考1 这篇博客对第三方库QXlsx介绍的比较详细。 1、概述 QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件&#xff0c;可以在Qt5支持的任何平台上使用。 2、使用方式 (1) QXlsx可以编译为静态库库使用&#xff08;可以提升项目编…

第03讲:使用kubeadm搭建k8s单master集群方案

一、安装前的准备工作 本实验使用1个master节点和2个node节点。 硬件配置&#xff08;必要&#xff09;&#xff1a;2GB 或更多 RAM&#xff0c;2 个 CPU 或更多 CPU&#xff0c;硬盘 30GB 或更多 开始本实验之前请先按照 使用kubeadm搭建k8s集群的准备工作 进行实验前的准备工…

从零开始带你实现一套自己的CI/CD(五)Jenkins+K8s

目录一、简介二、Jenkins K8s2.1 Jenkins配置k8s-master服务器信息2.2 配置镜像仓库信息2.3 编写k8s yaml文件2.4 将yaml文件推送到k8s2.5 配置免密钥登录2.6 k8s部署yaml资源文件2.7 重新部署yaml资源文件2.8 构建注意事项2.9 完整Jenkinsfile2.10 构建成功三、Webhook源码一…

合宙ESP32S3 CameraWebServe 测试demo

合宙ESP32S3 CameraWebServe 合宙ESP32S3 CameraWebServe测试&#xff0c;我们需要一个OV2640的摄像头模组用来采集图像传输给ESP32的&#xff0c;这里使用的OV2640是之前安信可十周年的白嫖的。现在直接插到合宙ESP32S3开发板&#xff0c;简直完美。还是白嫖好&#xff01;&a…

评估-----评估算法的指标

评估算法的优劣一般会用到以下参数&#xff1a; TN&#xff1a; 真反例 FN: 假反例 TP&#xff1a; 真正例 FP: 假正例 正样本负样本预测正样本TPFP预测负样本FNTN**精确率/查准率&#xff08;precision&#xff09;&#xff1a;**预测正确的正样本个数与预测为正样本的个数的…

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(函数发生器)】

目录 序言 &#x1f34d;放置虚拟仪器仪表 &#x1f349;函数发生器 序言 NI Multisim最突出的特点之一就是用户界面友好。它可以使电路设计者方便、快捷地使用虚拟元器件和仪器、仪表进行电路设计和仿真。 首先启动NI Multisim 14.0&#xff0c;打开如图所示的启动界面&am…

3-Spring创建

目录 1.创建一个普通的Maven项目 2.添加Spring框架支持(spring-context&#xff0c;spring-beans) 3.添加启动类 1.创建一个普通的Maven项目 不选择任何模板&#xff0c;直接点Next。 Name&#xff1a;项目名称&#xff1b; Location&#xff1a;项目保存路径&#xff1b; …

Lesson 3. 线性回归的手动实现(3.1 变量相关性基础理论 3.2 数据生成器与 Python 模块编写)

文章目录一、变量相关性基础理论二、数据生成器与 Python 模块编写1. 自定义数据生成器1.1 手动生成数据1.2 创建生成回归类数据的函数2. Python 模块的编写与调用在此前的内容当中&#xff0c;我们已经学习了关于线性回归模型的基本概念&#xff0c;并且介绍了一个多元线性回归…

看了以后大呼过瘾的程序员必备网站,速速收藏!

程序员必备的网站&#xff0c;网络上一搜一大把&#xff0c;动辄几十个甚至一百个&#xff0c;虽说大多数网站也都是实用的&#xff0c;但数量庞杂未免让人眼花缭乱。 这里我就只挑选精华&#xff0c;只挑选出程序员必备的8个网站&#xff0c;服务于程序员的工作&#xff06;生…