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

Liquibase,数据库无关的版本控制工具!

在现代软件开发中数据库的版本控制往往比代码版本控制更具挑战性。不同的开发环境、测试环境、生产环境可能使用不同的数据库产品如开发用H2、测试用MySQL、生产用PostgreSQL而传统的SQL脚本往往包含特定数据库的方言导致跨环境执行时频繁报错。更为棘手的是当需要回滚某个版本的变更时手动编写反向SQL不仅繁琐还容易出错。Liquibase正是为了解决这些问题而生的数据库版本控制工具。它通过XML、YAML、JSON或SQL格式的“变更日志”changelog文件来描述数据库结构的变化并以“变更集”changeset为单位进行管理支持绝大多数主流数据库MySQL、PostgreSQL、Oracle、SQL Server等真正实现了“一次编写到处运行”。在实际应用中无论是电商系统从开发到上线历经多次迭代还是SaaS平台需要为不同租户维护不同版本的数据结构Liquibase都能确保数据库状态与代码版本精准对齐并提供强大的回滚、差异对比等功能。例如在金融支付系统中监管要求所有数据变更必须有完整审计记录Liquibase的变更集元数据表DATABASECHANGELOG天然提供了这个能力在多语言支持的微服务架构中不同服务可能使用不同数据库但通过Liquibase的统一管理运维团队可以一键完成所有数据库的版本升级。Liquibase核心特性与基础使用Liquibase的核心抽象是“变更集”changeset每个changeset包含一个唯一标识id和作者以及具体的变更操作如创建表、添加列、插入数据。Liquibase在数据库中维护两张表DATABASECHANGELOG记录每个changeset的执行情况DATABASECHANGELOGLOCK用于分布式环境下的锁控制。执行时Liquibase对比已执行记录按顺序执行未执行的changeset。在Spring Boot中集成Liquibase引入Maven依赖xmldependency groupIdorg.liquibase/groupId artifactIdliquibase-core/artifactId /dependencySpring Boot会自动配置Liquibase默认从classpath:db/changelog/db.changelog-master.yaml或xml、sql加载。创建一个基础的changelog文件db.changelog-master.xmlxml?xml version1.0 encodingUTF-8? databaseChangeLog xmlnshttp://www.liquibase.org/xml/ns/dbchangelog xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd changeSet id1 authorzhangsan createTable tableNameuser column nameid typebigint autoIncrementtrue constraints primaryKeytrue/ /column column nameusername typevarchar(50) constraints nullablefalse/ /column column nameemail typevarchar(100)/ /createTable /changeSet /databaseChangeLog应用启动后Liquibase自动执行在数据库中创建user表并记录变更日志。深度案例电商订单系统跨数据库迁移考虑一个电商平台开发阶段使用H2内存数据库测试阶段使用MySQL生产环境准备切换为PostgreSQL。我们利用Liquibase的数据库无关特性编写一套变更集让它在不同数据库上都能正确执行同时处理复杂的数据迁移和回滚。1. 基础表结构所有环境通用在db.changelog-master.xml中引入多个变更集xmlchangeSet id2 authorlisi createTable tableNameorders column nameid typebigint autoIncrementtrue constraints primaryKeytrue/ /column column nameuser_id typebigint constraints nullablefalse/ /column column nametotal_amount typedecimal(10,2)/ column namestatus typevarchar(20) defaultValuePENDING/ column namecreate_time typedatetime defaultValueComputedCURRENT_TIMESTAMP/ /createTable /changeSet changeSet id3 authorwangwu addColumn tableNameorders column namecoupon_code typevarchar(50)/ /addColumn /changeSetautoIncrement、datetime、CURRENT_TIMESTAMP等写法在MySQL、PostgreSQL、H2中都能被Liquibase自动转换为合适的语法。2. 复杂数据迁移订单金额分拆为商品明细假设业务升级需要将orders表中的total_amount迁移到新的order_item表中并支持多商品。由于涉及数据重组仅靠声明式变更集不够需要结合SQL或使用Liquibase的sql标签。创建新的changelog文件v2-changes.xml并在master文件中引入xmlchangeSet id4 authorzhaoliu createTable tableNameorder_item column nameid typebigint autoIncrementtrue constraints primaryKeytrue/ /column column nameorder_id typebigint constraints nullablefalse/ /column column nameproduct_name typevarchar(200)/ column nameprice typedecimal(10,2)/ column namequantity typeint/ /createTable addForeignKeyConstraint baseTableNameorder_item baseColumnNamesorder_id referencedTableNameorders referencedColumnNamesid/ /changeSet changeSet id5 authorzhaoliu sql dbmsmysql, h2 INSERT INTO order_item (order_id, product_name, price, quantity) SELECT id, 历史订单商品, total_amount, 1 FROM orders; /sql sql dbmspostgresql INSERT INTO order_item (order_id, product_name, price, quantity) SELECT id, 历史订单商品, total_amount, 1 FROM orders; /sql /changeSet changeSet id6 authorzhaoliu dropColumn tableNameorders columnNametotal_amount/ /changeSet注意sql dbms属性限制了SQL仅在指定数据库上执行保证了跨数据库兼容性。Liquibase也支持sqlFile引用外部脚本进一步分离复杂SQL。3. 回滚支持Liquibase的一大亮点是自动生成回滚脚本。在变更集中添加rollback标签即可定义回滚逻辑xmlchangeSet id3 authorwangwu addColumn tableNameorders column namecoupon_code typevarchar(50)/ /addColumn rollback dropColumn tableNameorders columnNamecoupon_code/ /rollback /changeSet如果未显式定义回滚Liquibase会根据变更自动生成回滚语句如addColumn对应dropColumn。通过命令行mvn liquibase:rollback -Dliquibase.rollbackCount1可以回滚最近一个变更集非常适用于开发调试或紧急修复。4. 与CI/CD集成在Jenkins或GitLab CI中只需在构建步骤中执行mvn liquibase:update即可自动同步数据库到最新版本。结合Maven Profile可以针对不同环境使用不同的数据库连接配置实现真正的“一次构建随处部署”。xmlprofile iddev/id properties liquibase.urljdbc:h2:mem:testdb/liquibase.url liquibase.usernamesa/liquibase.username /properties /profile profile idprod/id properties liquibase.urljdbc:postgresql://prod-db:5432/ecommerce/liquibase.url liquibase.usernameapp_user/liquibase.username /properties /profile总结Liquibase以其数据库无关性、丰富的变更类型、内置回滚支持和与Spring Boot等框架的无缝集成成为企业级数据库版本管理的首选工具。它不仅解决了跨环境数据库差异的痛点还将数据库变更纳入了代码版本控制体系让开发和运维团队能够以标准化的方式协同管理数据结构演进。如果你的项目需要在多种数据库之间迁移或者希望摆脱手工维护SQL脚本的混乱局面Liquibase值得你立即引入。你在使用Liquibase时遇到过哪些难题有没有利用它的高级特性如上下文、标签、预条件设计过巧妙的工作流欢迎在评论区分享你的经验我们一起让数据库变更管理变得更加优雅

相关文章:

Liquibase,数据库无关的版本控制工具!

在现代软件开发中,数据库的版本控制往往比代码版本控制更具挑战性。不同的开发环境、测试环境、生产环境可能使用不同的数据库产品(如开发用H2、测试用MySQL、生产用PostgreSQL),而传统的SQL脚本往往包含特定数据库的方言&#xf…...

Ubuntu22.04下RocketMQ-CPP客户端2.2.0编译踩坑实录(附完整依赖包下载)

Ubuntu 22.04下RocketMQ-CPP客户端2.2.0编译全指南:从依赖解析到实战应用 在分布式消息中间件领域,RocketMQ以其高吞吐、低延迟的特性成为企业级应用的首选。而RocketMQ-CPP客户端作为C生态的重要桥梁,其编译过程却常让开发者陷入依赖地狱和…...

MFC界面现代化---自定义标题栏与控件美化实战

1. 为什么需要MFC界面现代化改造 很多老牌企业软件和工业控制系统都基于MFC框架开发,这些系统通常运行了十几年甚至更久。我接手过不少这类项目,最直观的感受就是界面实在太"复古"了——灰底蓝框的窗口、生硬的按钮、像素感明显的图标&#xf…...

从零搭建一个‘智能’前端项目:手把手整合Vite5、微前端和AI代码提示(2025工程化实战)

从零搭建一个‘智能’前端项目:手把手整合Vite5、微前端和AI代码提示(2025工程化实战) 在当今快速迭代的前端领域,掌握工程化能力已成为开发者从初级迈向中高级的关键门槛。本文将带你从零开始构建一个融合最新技术栈的智能前端项…...

告别系统卡顿:RyTuneX全方位性能优化指南

告别系统卡顿:RyTuneX全方位性能优化指南 【免费下载链接】RyTuneX RyTuneX is a cutting-edge optimizer built with the WinUI 3 framework, designed to amplify the performance of Windows devices. Crafted for both Windows 10 and 11. 项目地址: https://…...

从SEED-Labs实验到实战:手把手教你编写无零字节的x86 Shellcode(附完整代码)

从SEED-Labs实验到实战:手把手教你编写无零字节的x86 Shellcode(附完整代码) 当你第一次看到"Shellcode"这个词时,可能会联想到某种神秘的编程黑魔法。实际上,它是安全研究中最具实用价值的技能之一——一段…...

2023年最新YOLO模型对比:YOLOv7 vs YOLOX vs YOLOv5,哪个更适合你的项目?

2023年YOLO模型实战选型指南:从原理到落地的深度对比 在计算机视觉领域,目标检测一直是核心任务之一,而YOLO(You Only Look Once)系列作为其中的佼佼者,凭借其出色的实时性能赢得了广泛关注。2023年,随着YOLOv7的发布&…...

2026-04随笔记

2026-04-01因为前天工作卡住了,导致昨天没心情研究,一度以为我不适合这个工作,早上的时候回想了一下成功和失败的场景认真做对比细心分析发现一个 LoadBalance的ip没设置,虽然自动获取了,但是helm的其他地方也用了这个…...

新时达电脑调试软件上位机:支持256种全协议,便捷实现系统参数导入导出与备份

新时达软件上位机,256全协议 新时达电脑调试软件多协议,方便用电脑调试系统,可以从电脑导入 和导出参数到电脑保存控制柜前蹲半小时协议选错的痛,你懂不懂?U盘插了拔拔了插还是提示版本格式不匹配的烦躁,你…...

Claude Code教程(四)| Codex 配置(插件安装)

Claude Code教程(四)| Codex 配置(插件安装)一、核心定位(一句话看懂)二、前置准备(必做)2.1 核心环境要求(极简)2.2 关键说明(重要)三…...

提升 10 倍的学习效率,这款浏览器必装的AI插件为什么火了?

花了3 周时间写了一个浏览器插件,一个月陆陆续续下载量破 1000 啦 安装链接 为什么要做这个项目? 一开始我入门学习 langchain 大模型agent开发,在之前我不懂的问题需要在 google 上搜索非常多的资料 融会贯通以后才能得到答案&#xff0…...

【含文档+源码】基于Web的面对面爱心众筹平台的设计与实现

项目介绍本课程演示的是一款 基于Web的面对面爱心众筹平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料2.带你从零开始部署运行本套系统3.该项…...

HDMI数据的接收发送实验(八)

一、 概述 上一章节创建hex文件写入EDID编码,接下来我们需要把ROM中的数据通过IIC协议传输到HDMI中,为了能够更方便观察具体时序,我们首先模拟主机发送的IIC请求,这样可以根据仿真来观察IIC的传输过程。 二、模拟主机发送IIC时序 …...

别再乱选格式了!LVGL图片转换工具(lv_img_conv)保姆级使用指南,从BMP到C数组一次搞定

LVGL图像转换实战指南:从格式选择到批量处理的完整解决方案 在嵌入式UI开发中,图像资源处理往往是第一个技术门槛。许多开发者在使用LVGL时,80%的初期问题都集中在图像转换环节——为什么转换后的图片显示异常?如何平衡内存占用和…...

LeetCode 删除无效的括号:python 题解

简介 AI Agent 不仅仅是一个能聊天的机器人(如普通的 ChatGPT),而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统,更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料,agent的…...

如何用Dism++打造高效Windows系统维护工作流

如何用Dism打造高效Windows系统维护工作流 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language Dism是一款功能全面的Windows系统优化与维护工具,通过直观…...

从零到集群:基于Rocky Linux ARM64的虚拟化平台构建与自动化部署实战

1. 环境准备与基础配置 第一次接触ARM64架构的虚拟化平台搭建时,我踩过不少坑。不同于常见的x86环境,Rocky Linux ARM64在驱动支持和软件生态上有其特殊性。我们先从最基础的物理服务器配置说起。 假设你面前是一台刚拆封的ARM架构服务器,我…...

一文学习 工作流开发 BPMN、 Flowable

一、简化查询 1. 先看一下查询的例子 /// /// 账户获取服务 /// /// /// public class AccountGetService(AccountTable table, IShadowBuilder builder) {private readonly SqlSource _source new(builder.DataSource);private readonly IParamQuery _accountQuery build…...

一次慢改表引发的线上死锁事故复盘

一次慢改表引发的线上死锁事故复盘 一、事故背景 在一次常规的数据库表结构变更过程中,对某核心业务表执行了慢改表操作(使用 pt-online-schema-change)。操作开始后,短时间内触发报警: 部分接口响应时间显著上升出现请…...

有些路看起来很难走,其实是在带你慢慢变强

生活里,很多人都希望自己走的是一条轻松一点、顺利一点的路。最好努力了就能有结果,付出了就能被看见,遇到的问题也都能很快解决。可真正经历过一些事情后才会发现,人生并不会总按照理想的节奏前进。很多时候,那些让人…...

突破可视化边界:Charticulator重新定义数据叙事的技术实践

突破可视化边界:Charticulator重新定义数据叙事的技术实践 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 在数据可视化领域,传统工具往往…...

【帮宝抑菌膏】宝宝额头起红疹子怎么办?宝妈必看的原因与护理指南

宝宝额头突然冒出一片片红疹子,不仅让宝宝难受哭闹,更让新手父母揪心不已。作为深耕母婴护理领域十余年的专业品牌,帮宝凭借丰富的育儿指导经验和科学护理方案,为宝妈们提供全方位的解决方案。当发现宝宝额头起红疹子时&#xff0…...

OpenCascade实战:TopoDS_Shape数据结构的高效遍历与优化策略

1. TopoDS_Shape数据结构基础解析 在OpenCascade中,TopoDS_Shape是构建三维模型的基石。这个看似简单的类实际上包含了三个关键数据成员:myTShape、myLocation和myOrient。理解这三个字段的运作机制,是高效操作模型的前提。 myTShape是一个智…...

用Multisim 14.0复刻经典:手把手教你搭建一个能校时的数字电子钟(附完整仿真文件)

用Multisim 14.0打造高精度数字电子钟:从原理到仿真的完整实践指南 在数字电路的学习过程中,没有什么比亲手搭建一个功能完整的数字电子钟更能检验学习成果了。这个看似简单的项目实际上涵盖了振荡器、分频器、计数器、译码显示和校时电路等数字电路的核…...

如何用Obsidian构建你的个人知识管理系统:终极完整指南

如何用Obsidian构建你的个人知识管理系统:终极完整指南 【免费下载链接】kepano-obsidian My personal Obsidian vault template. A bottom-up approach to note-taking and organizing things I am interested in. 项目地址: https://gitcode.com/gh_mirrors/ke/…...

Windows右键菜单终极清理指南:3步让你的右键菜单重获新生

Windows右键菜单终极清理指南:3步让你的右键菜单重获新生 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 还在为每次右键点击文件时弹出的杂乱菜单而…...

OpenClaw龙虾推出官方中国镜像站,由字节跳动提供支持

文章目录前言龙虾是谁?为啥它搞个镜像站这么重要?中国镜像站来了:地址是 mirror-cn.clawhub.com背后的故事:腾讯、字节、龙虾的"三国演义"镜像站的意义:不只是个"加速器"怎么用?手把手…...

如何用ContextMenuManager彻底掌控Windows右键菜单?4阶段优化法让操作效率提升300%

如何用ContextMenuManager彻底掌控Windows右键菜单?4阶段优化法让操作效率提升300% 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager Windows右键菜单是…...

零下20度实测:国产SysMax PCAN FD在寒区标定中的稳定性与兼容性全记录

零下20度极限挑战:SysMax PCAN FD在寒区汽车电子标定中的实战全解析 当清晨的内蒙古满洲里气温骤降至-20℃,大多数电子设备早已进入"冬眠"状态,而我们的汽车电子标定工作却必须继续。在这个被称为"中国冷极"的地区&#…...

Oracle 数据库中的 REF 类型与触发器的使用

在 Oracle 数据库中,引用类型(REF)是对象类型之间关联的一种强大工具。特别是在复杂的企业应用中,REF 类型可以帮助我们建立对象间的引用关系,模拟现实世界的关系模型。本文将通过一个实际的例子,介绍如何在 Oracle 中使用 REF 类型,以及如何通过触发器(Trigger)来确保…...