使用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。
下面是我几次尝试的情况:
- 第一次尝试:直接传入对象参数,报错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
- 第二次尝试:写死空值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;`
- 第三次尝试:手动拼接变量到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
相关产品推荐
相关产品推荐

