liquibase-core更新方法不创建databasechangeloglock表

问题描述 投票:0回答:1

我正在更新 Java 中

liquibase-core
依赖项的版本(现在是 4.21.0)并注意到
update()
方法已被弃用。相反,我应该使用带有两个参数的更新方法:
Contexts
Writer
.

旧的、已弃用的

update
方法用于在执行任何其他操作之前创建两个表:
databasechangeloglock
databasechangelog
表。当我使用
update
方法的新的、未弃用的签名时,这不再发生并且没有生成
databasechangeloglock
。因此,从头开始运行会产生错误,因为所需的表不存在。

我尝试进行一些调试并注意到

generateSql
中的
CreateDatabaseChangeLogLockTableGenerator
不再被调用,而
update
方法的弃用版本就是这种情况。

谁能解释我如何解决这个问题并仍然生成所需的表格?

错误日志:

似乎有一个未解决的问题:https://github.com/liquibase/liquibase/issues/4150

java database database-migration liquibase
1个回答
0
投票

似乎以下更改引入了已弃用的更新方法:https://github.com/liquibase/liquibase/pull/3866/files#diff-68544baf236f867c4abf85787c970ddf1aee4802dd2ffb663ea5be6de0a28c9a

据我所知,现在运行变更日志更新的预期方法是改用

CommandScope
对象。至少这就是他们现在更改已弃用的更新功能所做的事情。如果您查看
public void update(Contexts contexts, LabelExpression labelExpression, boolean checkLiquibaseTables) throws LiquibaseException
方法的更改,他们现在使用以下代码来应用更改日志更新:

CommandScope updateCommand = new CommandScope(UpdateCommandStep.COMMAND_NAME);
updateCommand.addArgumentValue(DbUrlConnectionCommandStep.DATABASE_ARG, getDatabase());
updateCommand.addArgumentValue(UpdateCommandStep.CHANGELOG_FILE_ARG, changeLogFile);
updateCommand.addArgumentValue(UpdateCommandStep.CONTEXTS_ARG, contexts != null ? contexts.toString() : null);
updateCommand.addArgumentValue(UpdateCommandStep.LABEL_FILTER_ARG, labelExpression != null ? labelExpression.getOriginalString() : null);
updateCommand.addArgumentValue(UpdateCommandStep.CHANGE_EXEC_LISTENER_ARG, changeExecListener);
updateCommand.addArgumentValue(DatabaseChangelogCommandStep.CHANGELOG_PARAMETERS, changeLogParameters);
updateCommand.execute();

我用一种更简单的方法尝试了同样的方法,这对我有用:

private static void update(Database database, String changeLogLocation) throws CommandExecutionException {
    CommandScope updateCommand = new CommandScope(UpdateCommandStep.COMMAND_NAME);
    updateCommand.addArgumentValue(DbUrlConnectionCommandStep.DATABASE_ARG, database);
    updateCommand.addArgumentValue(UpdateCommandStep.CHANGELOG_FILE_ARG, changeLogLocation);
    updateCommand.execute();
}

关于未弃用的更新方法的

Writer
参数,我认为在这种情况下,所有更新查询都被重定向到传递的
Writer
,以便调用者可以挂钩到更新过程。至少当您创建
Writer
的简单实现并将传递给
write
方法的所有内容记录到控制台时,您将看到所有更新查询。

所有这些信息都是基于我作为图书馆用户的经验。所以请不要将这些观察结果作为官方声明。 :)

© www.soinside.com 2019 - 2024. All rights reserved.