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

使用porsager/postgres包更新PostgreSQL的jsonb字段时JSON语法错误问题求助

porsager/postgres包更新PostgreSQL的jsonb字段时JSON语法错误问题求助

大家好,我现在在Cloudflare Workers里用porsager/postgres包操作PostgreSQL数据库的CRUD,最近在更新jsonb类型字段的时候遇到了卡壳的问题,想请教下社区的朋友们怎么解决。

我的需求是:更新pedidos表中destinatario(jsonb类型)字段里的endereco子对象,因为destinatario还包含其他字段,所以用jsonb_set来做局部更新,不想覆盖整个destinatario。

下面是我几次尝试的情况:

  1. 第一次尝试:直接传入对象参数,报错JSON语法错误
    我一开始写的查询代码如下,想直接把要更新的子对象通过POSGRES_SQL模板传递:
POSGRES_SQL`UPDATE pedidos SET destinatario = jsonb_set(
  destinatario,
  '{endereco}',
  '${POSGRES_SQL({ cep, bairro, localidade, complemento, uf, logradouro, regiao, numero, referencia })}'
) WHERE _id = ${_id} RETURNING _id;`

结果直接抛出错误:Invalid input syntax for type json

  1. 第二次尝试:写死空值JSON字符串,能执行但无有效数据
    后来我把endereco的JSON字符串写死成空值形式,这次能成功执行更新,但所有字段都是空的,达不到我要更新数据的目的:
POSGRES_SQL`UPDATE pedidos SET destinatario = jsonb_set(
  destinatario,
  '{endereco}',
  '{ "cep": "", "bairro": "", "localidade": "", "complemento": "", "uf": "", "logradouro": "", "regiao": "", "numero": "", "referencia": "" }'
) WHERE _id = ${_id} RETURNING _id;`
  1. 第三次尝试:手动拼接变量到JSON字符串,报错参数类型无法识别
    接着我尝试把变量转成字符串后拼接到JSON结构里,结果又遇到了新的错误:
POSGRES_SQL`UPDATE pedidos SET destinatario = jsonb_set(
  destinatario,
  '{endereco}',
  '{ "cep": "${String(cep)}", "bairro": "${String(bairro)}", "localidade": "${String(localidade)}", "complemento": "${String(complemento)}", "uf": "${String(uf)}", "logradouro": "${String(logradouro)}", "regiao": "${String(regiao)}", "numero": "${String(numero)}", "referencia": "${String(referencia)}" }'
) WHERE _id = ${_id} RETURNING _id;`

这次的错误是:Could not determine data type of parameter $1

另外补充下,我用这个包做插入操作是完全正常的,代码如下,能正确写入包含jsonb字段的数据:

POSGRES_SQL`INSERT INTO pedidos ${POSGRES_SQL({ _id, uid, created_at: Date(), destinatario, objeto: {}, origem: {}, })} RETURNING _id;`

看起来问题出在更新时jsonb_set的参数处理上,有没有大佬知道怎么正确传递带变量的子对象参数,让jsonb_set能正确解析并完成局部更新呀?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 07:29:29