PostgreSQL查询JSONB数组报错:无法确定参数$1的数据类型
解决PostgreSQL jsonb数组预编译查询类型错误问题
问题原因
你原来的查询语句里,参数$1被嵌套在JSON字符串常量中,PostgreSQL无法识别这是独立参数,也没法推断其数据类型,因此抛出could not determine data type of parameter $1错误。而且这种写法本质上没真正用到预编译参数,依然存在SQL注入风险。
可行解决方案
方案1:用PostgreSQL函数构造jsonb匹配结构
利用jsonb_build_object和jsonb_build_array函数动态构造匹配的jsonb数组,直接传入参数值:
pg.query( "SELECT * FROM account WHERE data->'addresses' @> jsonb_build_array(jsonb_build_object('location', $1))", ['Berlin'] )
jsonb_build_object('location', $1):创建包含location键的jsonb对象,参数$1直接以字符串传入,类型明确。jsonb_build_array(...):将上述对象包装成jsonb数组,和data->'addresses'的数组结构匹配。
方案2:传入完整JSON字符串并转换为jsonb类型
在代码中构造好完整的匹配JSON结构,作为参数传入后显式转换为jsonb类型:
const matchData = JSON.stringify([{ location: 'Berlin' }]); pg.query( "SELECT * FROM account WHERE data->'addresses' @> $1::jsonb", [matchData] )
- 用
JSON.stringify确保JSON格式正确,避免手动转义出错。 - 通过
$1::jsonb将参数转为jsonb类型,让PostgreSQL能正确执行@>包含操作。
两种方案都严格使用预编译参数,完全规避SQL注入风险,同时解决了数据类型无法推断的问题。
内容的提问来源于stack exchange,提问作者Bellaraus
相关产品推荐
相关产品推荐

