当前位置: 首页 > 知识库问答 >
问题:

将UUID值插入PostgreSQL数据库时的解列问题

郎嘉树
2023-03-14

我正在使用Spring Boot 2和Liquibase(核心3.6.2),我的DB是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>

如果我在列id中指定类型UUID而不是字符串,liquibase将告诉我:

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

测试内容。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

问题出在位于liquibase核心依赖项中的ExecutablePREaredStatementBase类中,以及此类中创建此错误的方法行:

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方法,而不是setString。但如果这个问题位于liquibase核心,我该如何解决这个问题呢。罐子有人能帮我吗?


共有1个答案

蒋硕
2023-03-14

这很伤人,但我找到了解决方案。您需要在JDBC URL属性中指定参数stringtype=未指定。例如在application.properties中:

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

我希望这个答案能帮助到一些人。

 类似资料:
  • 问题内容: 我希望能够将bigints数组写入要用于Go历史记录的表中。不幸的是,我不能,当我这样做时`sql: converting Exec argument 这是我要插入的表的结构: 问题答案: 使用自定义类型实现database / sql / driver.Valuer:

  • 这很慢吗?我有一个表有4列ID姓氏教练城 我有一个添加数据按钮,它添加了300行,每列都包含数据,所以总共有1200条记录。 实际添加数据只需4分钟多(这意味着从我按下按钮到显示消息框完成)。 我在澳大利亚的ADSL2上,速度测试刚刚完成,下载速度为28ms ping 14.12Mbps,上传速度为0.49Mbps 我知道澳大利亚互联网是一个笑话,但这似乎真的很慢! 这仅仅是因为我的网络上传速度吗

  • 我在尝试将记录插入数据库时遇到错误。 错误如下: 守则: 数据库:

  • 我有一个将数据插入PostgreSQL表的Mulesoft流。数据类型为JSON。这是数据的副本:(我从调试器中抓取了这个,因为它即将调用插入命令) 当我尝试将其插入JSON列时,我得到了这个错误 所以我决定把它插入一个文本列,这就是它的样子 请注意,在“id”之后添加了“=”而不是“:”,并删除了引号。 我不知道为什么会这样。基本上,我只需要将JSON数据插入JSON列。 谢谢

  • 我忙于一项学校作业,我有一个由三个表组成的基本access数据库。Book、Reader和BookRated,其中as BookRated是交集表,主键userName来自Reader和ISBN来自Book组成BookRated的复合主键(作为外键)。 我正试图将信息插入书签表中,但出现以下错误

  • 我想使用以下格式的多维数组:value[n][],其中n是问题编号。使用此新设置,您将得到以下输入字段: 请注意,选定的值编码在value属性中。name属性只包含值所属的问题。 因此,上述输入说明的是: 我想在下面的“问题”和“答案”数据库表中插入这些详细信息: 问题表: 答案表: 现在,我已经尝试编写下面的mysqli/php代码来将这些值插入数据库,但是我收到了错误,并且在想要实现我想要实现