Проблема Liquibase при вставке значения UUID в базу данных PostgreSQL

2

Я использую Spring Boot 2 с Liquibase (Core 3.6.2), а моя БД - PostgreSQL. Я создаю таблицу этим набором изменений в своем db.changelog-master.xml:

<changeSet author="system" id="1">
    <createTable tableName="test">
        <column name="id" type="UUID">
            <constraints nullable="false"/>
        </column>
        <column name="note" type="VARCHAR(4096)"/>
    </createTable>
</changeSet>

Следующий набор изменений, используемый для вставки значений в эту таблицу из файла csv:

<changeSet author="system" id="2">
    <loadData encoding="UTF-8" file="classpath:liquibase/data/test.csv" quotchar="&quot;" separator="," tableName="test">
        <column header="id" name="id" type="STRING" />
       <column header="note" name="note" type="STRING"/>
    </loadData>
</changeSet>

Если я укажу тип UUID в идентификаторе столбца вместо STRING, то жидкость мне скажет:

loadData type of uuid is not supported. Please use BOOLEAN, NUMERIC, DATE, STRING, COMPUTED or SKIP

Содержимое файла test.csv:

"id","note"
"18d892e0-e88d-4b18-a5c0-c209983ea3c0","test-note"

Когда я запускаю приложение, Liquibase создал таблицу, и когда он пытается вставить значения, я получаю это сообщение:

ERROR: column "id" is of type uuid but expression is of type character varying

Проблема заключается в классе ExecutablePreparedStatementBase, который находится в зависимости от linibase-core и строках метода в этом классе, которые создают эту ошибку:

private void applyColumnParameter(PreparedStatement stmt, int i, ColumnConfig col) throws SQLException,
        DatabaseException {
    if (col.getValue() != null) {
        LOG.debug(LogType.LOG, "value is string = " + col.getValue());
        stmt.setString(i, col.getValue());
    }

Liquibase использовала JDBC и PreparedStatement для выполнения запросов. Проблема заключается в том, что тип столбца таблицы test является uuid, а Liquibase пытается вставить строку. И если мы вручную вставляем значения в эту таблицу с помощью JDBC, мы должны использовать метод setObject для PreparedStatement вместо setString. Но как я могу исправить эту проблему, если эта проблема находится в Liquibase-core.jar? Кто-нибудь может мне помочь?

Теги:
spring-boot
database-migration
liquibase

1 ответ

1

Это было очень больно, но я нашел решение. Вам нужно указать параметр stringtype=unspecified в свойстве URL-адреса JDBC. Например, в application.properties:

spring.liquibase.url=jdbc:postgresql://127.0.0.1:5432/postgres?stringtype=unspecified

Надеюсь, этот ответ поможет кому-то.

  • 0
    Более чистым решением было бы изменить ликвидазу, но это хороший обходной путь. Если вы не можете создать запрос на извлечение для этого, не могли бы вы по крайней мере сообщить об ошибке в Liquibase?
  • 0
    @ SteveDonie Хорошо, я постараюсь создать запрос на удаление с исправлением ошибок. Но как я могу "подать ошибку"? Первый раз слышу это)))
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню