【问题标题】:Liquibase fails during checking of non-existence of primary keyLiquibase 在检查主键不存在时失败
【发布时间】:2014-08-24 17:57:53
【问题描述】:

在将 mysql-connector 替换为 MariaDB 期间,我遇到了 Liquibase 在我检查主键不存在的变更集上失败的情况:

    <preConditions onFail="MARK_RAN">
        <not>
            <primaryKeyExists tableName="users"/>
        </not>
    </preConditions>

NullPointerException 失败

Error: null java.lang.NullPointerException at liquibase.snapshot.jvm.MySQLDatabaseSnapshotGenerator.convertPrimaryKeyName(MySQLDatabaseSnapshotGenerator.java:124)
at liquibase.snapshot.jvm.JdbcDatabaseSnapshotGenerator.readPrimaryKeys(JdbcDatabaseSnapshotGenerator.java:759)
at liquibase.snapshot.jvm.JdbcDatabaseSnapshotGenerator.createSnapshot(JdbcDatabaseSnapshotGenerator.java:243)
at liquibase.snapshot.DatabaseSnapshotGeneratorFactory.createSnapshot(DatabaseSnapshotGeneratorFactory.java:69)
at liquibase.precondition.core.PrimaryKeyExistsPrecondition.check(PrimaryKeyExistsPrecondition.java:52)
at liquibase.precondition.core.NotPrecondition.check(NotPrecondition.java:30)
at liquibase.precondition.core.AndPrecondition.check(AndPrecondition.java:34)
at liquibase.precondition.core.PreconditionContainer.check(PreconditionContainer.java:199)
at liquibase.changelog.ChangeSet.execute(ChangeSet.java:249)

如果我删除此子句,则 liquibase 可以正常工作。有趣的是,其他前置条件也可以正常工作,例如检查某些表是否存在。

在深入研究代码后,我发现问题出在 JdbcDatabaseSnapshotGenerator#readPrimaryKeys 中,我们尝试在其中获取主键。但是,当然,对于不同的数据库,有不同的实现,所以我使用 MariaDB 得到的 ResultSet(主键为空列)似乎有点不同,但是,有趣的是方法(在 MySQLDatabaseSnapshotGenerator 中)在哪里失败是这样的:

@Override
protected String convertPrimaryKeyName(String pkName) throws SQLException {
    if (pkName.equals("PRIMARY")) {
        return null;
    } else {
        return pkName;
    }
}

所以,如果它是相反的方式,它对我有用:) 我的意思是这样的:

if ("PRIMARY".equals(pkName))

问题:是 liquibase 的错误还是我做错了什么?

【问题讨论】:

  • 我讨厌 Java。
  • 是的,这不是一件好事。

标签: java mysql mysql-connector liquibase mariadb


【解决方案1】:

根据我的研究,我得出了这个结论。

这可能是 liquibase 的一个错误,但我发现我们使用的是相当旧的 2.0.5 版本。 升级到当前的 3.2.0 根本没有帮助,因为即使是第一个变更集也会失败,而且我使用哪个驱动程序(mysql-connector 或 mariadb)和哪个数据库(MySQL 或 PostgreSQL)都没有关系。另外,我发现的主要事情之一是根据这张票,liquibase 实际上不支持 MariaDb: https://liquibase.jira.com/browse/CORE-1411

此外,我在想也许 MariaDb 有其他版本,但现在似乎只有一个: http://mvnrepository.com/artifact/org.jumpmind.symmetric.jdbc/mariadb-java-client

因此,通常删除这些先决条件可以解决我的问题,数据库至少与全新安装相同。但是,我仍然认为它不应该是这样的,所以如果有人有其他想法,我会很高兴。

【讨论】:

  • 您遇到问题的代码在 3.2.0 中不存在。我在 3.2.1 上对 mariadb 进行了一些测试,它似乎通常对我有用。如果您遇到特定问题,能否将它们添加到 CORE-1411 问题中以便进行调查?
  • 回到这个问题时我一定会这样做。我们的应用程序中还有一些其他部分会影响我尚未调查的查询。
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 2019-10-03
  • 2016-10-29
  • 2017-06-19
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
相关资源
最近更新 更多