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

标签 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 中,我们在其中尝试获取主键。但是当然,对于不同的数据库有不同的实现,所以它似乎有点不同,我使用 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/

相关文章:

java - 致命异常 : main java. lang.RuntimeException:无法启动 Activity

java - 在 IntelliJ 中的弹出 JavaDoc 上隐藏 JetBrains 注释

Mysql排序字母和数字的混合字符串,字母在数字之前

mysql - 从数据库获取动态值到 Rails View

mysql_options() 在 mysqlclient.lib 中崩溃

java - 获取函数以数组中的值作为输入JAVA

java - 如何从值转换为枚举?

mysql - 无法在mysql查询中实现where子句

c# - "Fatal error encountered during command execution."mysql-connector .net

mysql - "Table ' users.my_aspnet_Sessions ' doesn' t 存在”