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

时间:2014-07-03 14:32:43

标签: java mysql mysql-connector liquibase mariadb

在将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中,我们尝试获取主键。但是当然,对于不同的数据库有不同的实现,所以看起来它有点不同的ResultSet(主键为空列)我使用MariaDB,但是,有趣的是该方法(在MySQLDatabaseSnapshotGenerator中)失败就是这样:

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

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

if ("PRIMARY".equals(pkName))

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

1 个答案:

答案 0 :(得分:0)

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

可能这是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

因此,通常删除这些preConditions修复了我的问题,数据库至少与干净安装相同。但是,我仍然认为它不应该是这样的,所以如果有人有其他想法会很高兴。