在将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的错误还是我做错了什么?
答案 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修复了我的问题,数据库至少与干净安装相同。但是,我仍然认为它不应该是这样的,所以如果有人有其他想法会很高兴。