Estoy usando la primavera de arranque 2 con Liquibase (Core 3.6.2) y mi DB es PostgreSQL. Estoy creando mesa junto a este conjunto de cambios en mi 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>
El siguiente conjunto de cambios se utiliza para insertar valores de esta tabla desde un archivo 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>
Si especifico tipo UUID en la columna ID en lugar de la CADENA Liquibase me dirá:
loadData type of uuid is not supported. Please use BOOLEAN, NUMERIC, DATE, STRING, COMPUTED or SKIP
El contenido de test.csv archivo:
"id","note"
"18d892e0-e88d-4b18-a5c0-c209983ea3c0","test-note"
Cuando corro aplicación, tabla creada Liquibase y cuando se intenta insertar valores me sale este mensaje:
ERROR: column "id" is of type uuid but expression is of type character varying
El problema está en ExecutablePreparedStatementBase clase que se encuentra en dependencia Liquibase-core, y filas de método en esta clase que crean este error:
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 utiliza JDBC y PreparedStatement para ejecutar consultas. El problema se debe a que el tipo de columna de la tabla de prueba es UUID , y Liquibase intentó insertar cadena . Y si insertamos los valores manualmente a esta tabla mediante JDBC debemos utilizar setObject
el método del PreparedStatement
lugar de setString
. Pero, ¿cómo puedo solucionar este problema si este problema localizado en Liquibase-core.jar? ¿Alguien me puede ayudar?
Fue muy duele, pero he encontrado solución. Es necesario especificar el parámetro stringtype=unspecified
en su propiedad JDBC URL. Por ejemplo, en application.properties:
spring.liquibase.url=jdbc:postgresql://127.0.0.1:5432/postgres?stringtype=unspecified
Espero que esta respuesta ayude a alguien.