在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
相关产品推荐
相关产品推荐

