在将 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 得到的结果集(主键为空列),然而,有趣的是方法(在 MySQLDatabaseSnapshotGenerator 中)在哪里它失败是这样的:
@Override
protected String convertPrimaryKeyName(String pkName) throws SQLException {
if (pkName.equals("PRIMARY")) {
return null;
} else {
return pkName;
}
}
所以,如果它是相反的方式,它对我有用:)就像这样我的意思是:
if ("PRIMARY".equals(pkName))
问题:这是 liquibase 的错误还是我做错了什么?
最佳答案
根据我的研究,我得出了这个结论。
可能是 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
因此,一般来说,删除这些先决条件可以解决我的问题,数据库至少与全新安装是相同的。然而,我仍然认为它不应该是这样的,所以如果有人有其他想法,我会很高兴听到。
关于java - Liquibase 在检查主键不存在时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24556601/