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

如何在pgtyped中实现JSON数组包含动态值的行查询?

如何在pgtyped中实现JSON数组包含动态值的行查询?

我之前也踩过pgtyped处理JSONB包含查询的坑,尤其是动态参数这块,官方文档确实没讲太细,很容易出现参数类型被推断成never的情况。结合你的需求,给你两个靠谱的解决方案:

方案1:显式指定参数为JSONB类型

你原来的写法没有告诉pgtyped参数的具体SQL类型,导致它没法正确推断TS类型。只需要在参数后面加上::jsonb显式转换,就能让pgtyped识别出参数类型:

SELECT * FROM my_table 
WHERE my_col->'my_field' @> :dyn_val::jsonb!;

这样生成的TypeScript函数参数就会是{ dyn_val: unknown }(或者更具体的JSON类型,取决于你的pgtyped版本),而不是never。调用的时候直接传JSON格式的值就行,比如:

// 如果你要传单个元素的数组
const result = await yourQueryFunction({ dyn_val: ['awesome value'] });
// 或者传JSON字符串也可以,pgtyped会自动处理
const result = await yourQueryFunction({ dyn_val: '["awesome value"]' });

方案2:用jsonb_build_array构造查询数组

如果你的需求是检查JSON数组是否包含某个单个值,可以用PostgreSQL的jsonb_build_array函数来动态构造匹配的JSON数组,这种方式更安全,避免手动拼接JSON的潜在错误:

SELECT * FROM my_table 
WHERE my_col->'my_field' @> jsonb_build_array(:dyn_val!);

这个写法里,dyn_val就是你要检查的单个值(比如字符串"awesome value"),jsonb_build_array会把它包装成JSON数组,刚好匹配@>操作符的要求。pgtyped能自动推断dyn_val的类型(比如如果是字符串,生成的TS参数就是string类型),完全不会出现never的问题。

为什么原来的写法不行?

pgtyped的类型推断依赖于明确的SQL类型信息,你原来的写法里,dyn_val没有任何类型标注,pgtyped没法判断它是字符串、JSON还是其他类型,所以只能生成never类型的参数。只要给参数加上明确的SQL类型提示(比如::jsonb),或者用SQL函数帮它推导类型,就能解决这个问题。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:53:07