You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Neon托管PostgreSQL中用单引号包裹复合类型(ARRAY/ROW)报错求助

PostgreSQL字符串形式传递ROW/ARRAY复合类型的解决办法

你手动拼接ROW和ARRAY的字符串格式完全不符合PostgreSQL的解析规则,尤其是嵌套结构的引号转义和类型字面量格式错得离谱,直接给你两种能用的写法:

写法一:标准字面量+显式类型转换

假设message_content是你定义的复合类型(比如结构是text, message_embed[], message_attachment[], message_button[], boolean),按PostgreSQL规范写字面量字符串,再转成目标类型:

UPDATE communication.messages
SET message_content = '(test, {"(test,test,0,{""(test,2,true)""})"}, {}, {}, true)'::message_content -- 替换成你实际的复合类型名
WHERE id = 'dd998de9-2da9-4fda-9530-fbe90c078f18'
RETURNING *;

这里的关键规则:

  • 复合类型整体用()包裹,字段用逗号分隔
  • 数组用{}装元素,元素是复合类型的话用(),嵌套的引号要双写转义(比如"")
  • 空数组直接写{},别加额外单引号

写法二:用构造器(最稳妥,推荐)

如果你的无服务器环境能直接执行带构造器的SQL,就用你一开始的正确写法,完全不用手动处理转义,不会出错:

UPDATE communication.messages
SET message_content = row (
    'test', 
    ARRAY [
        row ('test','test','0', ARRAY [row ('test','2','true')] :: message_embed_field[])
    ]::message_embed[],
    ARRAY []::message_attachment[],
    ARRAY []::message_button[], 
    'true'
)
WHERE id = 'dd998de9-2da9-4fda-9530-fbe90c078f18'
RETURNING *;

你原来的写法为啥报错?

你写的'{}'是个字符串值,但PostgreSQL需要的是数组字面量{},多套了一层单引号导致解析失败。而且嵌套的ARRAY和ROW结构完全乱了,PostgreSQL根本没法把这种字符串解析成复合类型。

内容的提问来源于stack exchange,提问作者SwordOfSouls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:22:54