Liquibase在检查主键不存在时失败



在将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)

如果我删除这个子句,液体库工作良好。有趣的是,其他前提条件工作得很好,例如,检查某些表是否存在。

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

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

所以,如果它是相反的方式,它将为我工作:)像这样,我的意思是:

if ("PRIMARY".equals(pkName))

问题:这是一个错误的液体基础或也许我做错了什么?

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

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

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

因此,一般来说,删除这些先决条件可以解决我的问题,至少在干净安装时数据库是相同的。然而,我仍然认为它不应该是这样的,所以如果有人有其他的想法,我会很高兴听到。

相关内容

  • 没有找到相关文章

最新更新