Liquibase格式化SQL文件注释SQL后变更集被标记执行的问题咨询
问题解答
首先明确:这不是在Liquibase格式化SQL中注释SQL查询的正确方式,而databasechangelog表中生成执行记录的原因和Liquibase的变更集跟踪逻辑直接相关,下面详细拆解:
为什么会出现“SQL没执行但变更集被标记已执行”的现象?
Liquibase解析格式化SQL时,核心识别的是--changeset这类元指令行。你用--把SQL语句整个注释掉后,变更集的定义(--changeset harv:1 --comment test)是完全合法有效的,Liquibase会判定这个变更集“没有需要执行的SQL操作”,但依然会把它标记为“已处理”——因为Liquibase的核心逻辑是跟踪变更集是否被扫描处理过,而非变更集里的SQL是否实际运行。只要变更集的元信息(作者、ID、注释)合规,Liquibase就会把它写入databasechangelog,避免后续重复处理同一个变更集。
正确的SQL注释方式
如果要在变更集里注释掉SQL,应该使用数据库本身的注释语法,而非用Liquibase的指令注释符--包裹整个SQL:
- 针对Oracle的单行注释:在SQL语句前加
--(注意是SQL语句内部的注释,不是变更集指令行):--liquibase formatted sql --changeset harv:1 --comment test -- update table set col=null; -- 这行SQL会被Oracle忽略,不会执行 - 多行或整段SQL注释,更稳妥的是用块注释
/* */:--liquibase formatted sql --changeset harv:1 --comment test /* update table set col=null; update table set col2=1; */ -- 这段块注释里的SQL都不会被执行
如果想完全禁用变更集(不生成databasechangelog记录)
如果你的目的是暂时让某个变更集不被Liquibase处理,应该把整个变更集的定义也注释掉,比如用块注释包裹:
--liquibase formatted sql /* --changeset harv:1 --comment test update table set col=null; */ -- 这个变更集会被Liquibase完全忽略,不会写入databasechangelog --changeset harv:2 --comment test update table set col1=null;
内容的提问来源于stack exchange,提问作者harv3
相关产品推荐
相关产品推荐

