PostgreSQL中jsonb的减号运算符能否使用参数而非硬编码值?
问题原因
核心是参数类型和PostgreSQL运算符预期不匹配。
PostgreSQL 中jsonb类型的-运算符有两套匹配逻辑:
- 右操作数为
整数时:删除jsonb数组中对应下标的元素 - 右操作数为
字符串时:删除jsonb对象中对应键名的键值对
你代码里把findIndex返回的数字下标调用了.toString()转成了字符串类型,传入数据库后PostgreSQL会认为你要删除json对象的指定key,而你的games字段是数组类型,自然没有匹配的操作结果,所以没有数据被删除。硬编码写1的时候PostgreSQL默认识别为整数类型,符合数组下标删除的逻辑,所以能正常执行。
解决方法
- 直接删除
.toString()调用,传入数字类型的下标即可:
// 去掉.toString(),直接保留数字类型 const gameIndex = rowsCopy[0].games.findIndex(obj => obj.game == gameID); const deleteGameQuery = ` update users set games = games - $1 where username = $2 ` const { rows } = await query(deleteGameQuery, [gameIndex, username]);
- 如果担心驱动自动类型转换有问题,可以在SQL中显式强转参数为整数:
update users set games = games - $1::int where username = $2
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

