Liquibase maven 插件的使用

1.引入插件

pom.xml

xml 复制代码
<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>4.24.0</version>
    <configuration>
        <!-- 基本的 Liquibase 配置 -->
        <propertyFile>src/main/resources/liquibase.yml</propertyFile>
    </configuration>
</plugin>

liquibase.yml

yaml 复制代码
# Liquibase 数据库连接
driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/liquibase_demo
username: root
# 必填 ,变更日志位置
changeLogFile: src/main/resources/liquibase/db.changelog-master.xml
# 使用maven插件命令 liquibase:generateChangeLog 时输出的文件。 作用 将连接的数据库的表结构生成日志变更文件
outputChangeLogFile: /Users/kafeim/IdeaProjects/demo/src/main/resources/liquibase/db.changelog-diff.xml

maven 命令

liquibase:changelogSyncSQL

将变更日志中的文件标记为已执行的状态。这个时候还未执行,会把将要执行的SQL放在 targe\liquibase\migrate.sql 。

生成的migrate.sql文件

sql 复制代码
--  *********************************************************************
--  SQL to add all changesets to database history table
--  *********************************************************************
--  Change Log: src/main/resources/liquibase/db.changelog-master.xml
--  Ran at: 2023/11/12 下午9:34
--  Against: root@localhost@jdbc:mysql://localhost:3306/liquibase_demo
--  Liquibase version: 4.20.0
--  *********************************************************************

--  Lock Database
UPDATE DATABASECHANGELOGLOCK SET `LOCKED` = 1, LOCKEDBY = 'kafeimdeMacBook-Pro.local (192.168.3.7)', LOCKGRANTED = NOW() WHERE ID = 1 AND `LOCKED` = 0;

INSERT INTO DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, `DESCRIPTION`, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1699778673366-1', 'kafeim (generated)', 'src/main/resources/liquibase/changelog/db.changelog-diff.xml', NOW(), 1, '8:17a4bb8928126f2ec2830e6199a4f73b', 'createTable tableName=t_user', '', 'EXECUTED', NULL, NULL, '4.20.0', '9796090139');

--  Release Database Lock
UPDATE DATABASECHANGELOGLOCK SET `LOCKED` = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1;

这里注意,maven 插件中的路径不要使用classpath来映射,会一直到不到路径的。

maven插件配置的路径都不能用 classpath

liquibase:changelogSync

将变更日志中的文件标记为已执行的状态。在执行这个命令前,最好先去运行 liquibase:changelogSyncSQL 生成SQL 审查一下需要执行的SQL

liquibase:tag

liquibase:tag 命令在 Liquibase 中用来给当前数据库的状态打上一个"标签"。 它是给变把你DATABASECHANGELOG表 最后一次执行的变更日志的记录的 tag 属性的值改成了你定义的版本

注意: 在运行这个命令前确保 tag 的值是唯一的。确保DATABASECHANGELOG已经存在记录了。

tag的作用

  1. 可以用来回滚,回滚时可以指定回滚到标记的那个变更日志的记录
  2. 可以用来修改已执行状态命令的范围 liquibase:changelogSyncToTag

liquibase:changelogSyncToTagSQL

liquibase:changelogSyncToTagSQL 命令在 Liquibase 中用于生成 SQL 语句,这些语句会将变更日志文件中直到指定标签为止的所有变更集标记为已执行,但实际上并不执行这些 SQL。 生成的sql 文件会在 targe\liquibase\migrate.sql 目录下。

xml 复制代码
            <plugin>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <configuration>
                    <!-- 基本的 Liquibase 配置 -->
                    <propertyFile>src/main/resources/liquibase.yml</propertyFile>
                    <toTag>v2.0</toTag>
                </configuration>
            </plugin>

liquibase:changelogSyncToTag

liquibase:changelogSyncToTag 会将变更日志文件中直到指定标签为止的所有变更集标记为已执行

最好先运行 liquibase:changelogSyncToTagSQL 生成SQL查看下是否正确。

按道理来说,存在DATABASECHANGELOG 表的记录都是已经执行的记录。但是在某些情况下,数据库可能由于手动执行的 SQL 而更新,而这些更新没有通过 Liquibase 进行跟踪。如果这些变更对应于一个已知的标签,那么使用 changelogSyncToTagSQL 可以帮助将 DATABASECHANGELOG 表与实际数据库状态同步。 这里指定是手动执行了SQL ,并且又手动往 DATABASECHANGELOG 表增加了记录的情况。

liquibase:clearCheckSums

liquibase:clearCheckSums 命令清除校验和后,Liquibase 不会 重新执行任何变更集。此命令只是简单地清除 DATABASECHANGELOG 表中每个变更集的校验和值。

下次当您运行 liquibase:update 或者任何执行变更集的命令时,Liquibase 会为那些没有校验和的变更集重新计算并保存新的校验和。这个过程不涉及执行变更集中的任何数据库修改操作,它只是更新了 DATABASECHANGELOG 表中记录的校验和信息。

这里的校验和 指的是数据库中 MD5SUM 字段。

liquibase:diff

数据库差异对比,对比两个数据库结构的差异并生成变更日志。

1. 数据库与数据库对比

xml 复制代码
# 必填 ,变更日志位置
changeLogFile: src/main/resources/liquibase/db.changelog-master.xml
# Liquibase 数据库连接
driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/liquibase_demo
username: root
# 参照数据库
referenceUrl: jdbc:mysql://localhost:3306/demo
referenceUsername: root
# 差异文件位置
diffChangeLogFile: src/main/resources/diff/liquibase-diff-result2.xml

2. 数据库与快照 进行对比。

xml 复制代码
# Liquibase 数据库连接
driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/liquibase_demo
username: root
# 必填 ,变更日志位置
changeLogFile: src/main/resources/liquibase/db.changelog-master.xml
# 如果变更日志中包含其他变更日志,需要指定变更日志的位置
# liquibase:diff 命令时需要的参数,参照数据库
referenceUrl: offline:mysql?snapshot=src/main/resources/liquibase/a.json
diffChangeLogFile: /Users/kafeim/IdeaProjects/demo/src/main/resources/diff/liquibase-diff-result.xml

offline:mysql 表示离线数据库,用来加载数据库快照的。 snapshot=src/main/resources/liquibase/a.json 这里的路径一定不能使用 classpath ,识别不了。

数据库快照生成方式有两种

  1. 通过cli 生成。
  2. 通过Java API生成

目录的maven插件还未提供相快照关的命令

liquibase:generateChangeLog

liquibase.yml 配置文件

yml 复制代码
changeLogFile: src/main/resources/liquibase/db.changelog-master.xml
url: jdbc:mysql://127.0.0.1:33306/liquibase_demo
username: root
driver: com.mysql.cj.jdbc.Driver
outputChangeLogFile: src/main/resources/liquibase/db.changelog-result.xml
dataDir: src/main/resources/liquibase/data

这个命令是用来生成 changelog 变更日志的,它会连接数据库将数据库的表结构转换成 changelog 变更日志,并输出到 outputChangeLogFile 设置的位置,这个只会生成数据结构的变更日志。

dataDir属性,如果填写了会将数据以csv的文件格式写入到这个位置

如果是生成带数据库导入的,记得将 src/main/resources/liquibase/changelog/data/t_user.csv 改为 calsspath:liquibase/changelog/data/t_user.csv 不然项目启动时识别不了 src 路径的。

还有输出的文件outputChangeLogFile可以输出成SQL ,但是输出的名称要规范。

例如:

  • src/main/resources/liquibase/db.changelog-result.mysql.sql
  • src/main/resources/liquibase/db.changelog-result.h2.sql

liquibase:updateSQL

根据配置的 changeLogFile 文件生成要执行的 迁移SQL。在确定执行迁移操作前,可以先使用此命令生成迁移的SQL进行审查。

liquibase:update

根据配置的 changeLogFile 文件生成要执行的 迁移操作

相关推荐
BillKu40 分钟前
Windows Server部署Vue3+Spring Boot项目
windows·spring boot·后端
钟离墨笺2 小时前
Go语言学习-->编译器安装
开发语言·后端·学习·golang
钟离墨笺3 小时前
Go语言学习-->从零开始搭建环境
开发语言·后端·学习·golang
烛阴8 小时前
自动化测试、前后端mock数据量产利器:Chance.js深度教程
前端·javascript·后端
.生产的驴8 小时前
SpringCloud 分布式锁Redisson锁的重入性与看门狗机制 高并发 可重入
java·分布式·后端·spring·spring cloud·信息可视化·tomcat
攒了一袋星辰8 小时前
Spring @Autowired自动装配的实现机制
java·后端·spring
我的golang之路果然有问题8 小时前
快速了解GO+ElasticSearch
开发语言·经验分享·笔记·后端·elasticsearch·golang
love530love9 小时前
Windows 下部署 SUNA 项目:虚拟环境尝试与最终方案
前端·人工智能·windows·后端·docker·rust·开源
元闰子9 小时前
走技术路线需要些什么?
后端·面试·程序员
元闰子9 小时前
AI Agent需要什么样的数据库?
数据库·人工智能·后端