Проблема Liquibase при вставке значения UUID в базу данных PostgreSQL - PullRequest
0 голосов
/ 03 октября 2018

Я использую 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 в столбце id вместо 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, который находится в зависимости от ядра liquibase, истроки метода в этом классе, которые создают эту ошибку:

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 попытался вставить string .И если мы вручную вставляем значения в эту таблицу с помощью JDBC, мы должны использовать setObject метод PreparedStatement вместо setString.Но как я могу исправить эту проблему, если эта проблема находится в liquibase-core.jar?Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 03 октября 2018

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

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

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

...