如何在node-postgres中向json[]类型列添加新JSON对象?
解决PostgreSQL json[]列添加JSON对象的报错问题
错误原因
你的代码存在两个核心问题:
- 将参数占位符
$1用单引号包裹,导致PostgreSQL把它识别为普通字符串字面量,而非参数引用,触发数组格式解析错误。 - 传入的JSON字符串需要先转换为
json类型,再包装成json[]数组,才能和原有alerts列(json[]类型)进行拼接操作。
正确写法
以下两种方法均可解决问题:
方法一:使用array[]构造数组
await pool.query( "UPDATE datas SET alerts = alerts || array[$1::json] WHERE id = '10'", [JSON.stringify({ name: "alert1", time: "12:00" })] );
$1::json将传入的字符串参数转为json类型,array[]把该json对象构造成单个元素的json[]数组,再通过||运算符和原数组拼接。
方法二:使用json_build_array函数
await pool.query( "UPDATE datas SET alerts = alerts || json_build_array($1::json) WHERE id = '10'", [JSON.stringify({ name: "alert1", time: "12:00" })] );
json_build_array函数直接将传入的json对象包装为json[]数组,实现和原数组的拼接。
处理NULL情况
如果alerts列可能为NULL,建议用COALESCE确保拼接正常:
await pool.query( "UPDATE datas SET alerts = COALESCE(alerts, '{}'::json[]) || array[$1::json] WHERE id = '10'", [JSON.stringify({ name: "alert1", time: "12:00" })] );
COALESCE(alerts, '{}'::json[])会在alerts为NULL时,用空的json数组替代,避免拼接失败。
内容的提问来源于stack exchange,提问作者Jantoma21
相关产品推荐
相关产品推荐

