Я использую 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=""" 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? Кто-нибудь может мне помочь?
Это было очень больно, но я нашел решение. Вам нужно указать параметр stringtype=unspecified
в свойстве URL-адреса JDBC. Например, в application.properties:
spring.liquibase.url=jdbc:postgresql://127.0.0.1:5432/postgres?stringtype=unspecified
Надеюсь, этот ответ поможет кому-то.