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
相关产品推荐
相关产品推荐

