Я использую 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 в столбце 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?Кто-нибудь может мне помочь?