programing

기본 키가 존재하지 않는지 확인하는 동안 리퀴베이스가 실패함

randomtip 2022. 12. 31. 16:43
반응형

기본 키가 존재하지 않는지 확인하는 동안 리퀴베이스가 실패함

mysql-connector를 MariaDB로 교환하는 동안 프라이머리 키의 존재를 확인하는 변경 세트에서 Liquibase가 실패하는 상황이 되었습니다.

    <preConditions onFail="MARK_RAN">
        <not>
            <primaryKeyExists tableName="users"/>
        </not>
    </preConditions>

Null Pointer에서 실패합니다.예외.

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)

내가 이 조항을 제거하면 액화효소는 잘 작동한다.흥미로운 점은 다른 pre Conditions가 정상적으로 동작한다는 것입니다.예를 들어 테이블 존재 여부를 체크하는 것입니다.

코드를 자세히 살펴보니 JdbcDatabaseSnapshotGenerator#readPrimaryKeys에 문제가 있음을 알 수 있었습니다.여기서 프라이머리 키를 가져오려고 합니다.그러나 물론 데이터베이스마다 구현이 다르기 때문에 MariaDB를 사용하여 얻을 수 있는 결과 세트(프라이머리 키의 null 컬럼 포함)는 조금 다른 것 같습니다만, 재미있는 것은 MySQLDatabaseSnapshotGenerator에서 실패하는 메서드는 다음과 같습니다: MySQLDatabaseSnapshotGenerator에서 얻을 수 있습니다.

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

그래서 반대일 경우, 저는 이 방법을 사용할 수 있습니다:) 제 말은 다음과 같습니다.

if ("PRIMARY".equals(pkName))

질문: 그것은 액상병의 벌레인가 아니면 내가 뭔가 잘못하고 있는 것인가?

내 연구에 따르면 나는 이런 결론에 도달했다.

아마 리퀴베이스의 버그일 것입니다만, 알고 보니 꽤 오래된 버전 2.0.5를 사용하고 있습니다.첫 번째 변경 세트에서도 오류가 발생하고 어떤 드라이버(mysql-connector 또는 mariadb)와 어떤 데이터베이스(MySQL 또는 PostgreSQL)는 중요하지 않기 때문에 최신 3.2.0으로 업그레이드해도 전혀 도움이 되지 않았습니다.또, 이 티켓에 의하면, 리퀴베이스는 실제로 MariaDb를 서포트하고 있지 않습니다.https://liquibase.jira.com/browse/CORE-1411

게다가 MariaDb에는 다른 버전이 있을지도 모른다고 생각하고 있습니다만, 현재는 1개밖에 없는 것 같습니다.http://mvnrepository.com/artifact/org.jumpmind.symmetric.jdbc/mariadb-java-client

따라서 이러한 preConditions를 삭제하면 문제가 해결됩니다.데이터베이스는 적어도 클린 설치와 동일합니다.하지만, 저는 아직 이대로는 안 된다고 생각하고 있기 때문에, 만약 다른 생각을 하고 있다면 좋을 것 같습니다.

언급URL : https://stackoverflow.com/questions/24556601/liquibase-fails-during-checking-of-non-existence-of-primary-key

반응형