You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liquibase升级至4.23后变更未实际执行问题求助

Liquibase 4.23.0 变更未实际执行问题解决方案

问题根源

你调用的lb.update(contexts, output)方法是Liquibase 4.x版本的**模拟执行(Dry Run)**入口,它仅会把变更内容输出到指定流,不会真正执行数据库变更,因此内部自动使用LoggingExecutor代替JdbcExecutor,这就是只有日志输出但无实际变更的原因。

解决方案

方案1:使用标准update重载方法

直接调用不带输出流的update方法,让Liquibase使用JdbcExecutor执行实际变更:

修改后的调用代码:

DataSource ds = ...
try (
    Connection c = ds.getConnection();
    Liquibase lb = new Liquibase(changelog, new DirectoryResourceAccessor(root), new JdbcConnection(c))
) {
    // 检查并升级Liquibase系统表
    lb.checkLiquibaseTables(false, lb.getDatabaseChangeLog(), new Contexts(contexts), new LabelExpression());
    // 执行实际变更
    lb.update(new Contexts(contexts), new LabelExpression());
}

如果不需要上下文和标签过滤,可简化为:

lb.update(contexts);

方案2:需输出变更日志同时执行实际变更

若既要执行变更,又要记录变更内容,不要用带输出流的update方法,而是通过日志配置实现:

  • 确保项目引入日志框架(如SLF4J + Logback/Log4j2)
  • 将Liquibase的日志级别设为INFO,执行过程中的变更详情会自动输出到日志或控制台,无需手动传入输出流。

验证

修改后重启项目,调试时会看到Liquibase使用JdbcExecutor,同时DATABASECHANGELOG表会新增变更记录,数据库结构也会同步更新。

内容的提问来源于stack exchange,提问作者gnomie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:41:05