如何在sqlc与Go中实现接收[]int64的IN查询?
解决sqlc生成[]int64参数实现IN/ANY查询的问题
问题核心
你遇到的问题源于sqlc对PostgreSQL类型的映射规则:
- 直接写
IN ($1)时,sqlc无法识别这是数组参数,默认解析为单个int64 - 使用
ANY ($1::int[])时,int[]对应Go的[]int32,但你的ID字段是BIGSERIAL(对应PostgreSQL的bigint类型),需要匹配bigint[]类型才能生成[]int64参数
两种可行解决方案
方案1:用sqlc专属list标签实现IN查询
sqlc支持通过:list标签直接处理IN查询的数组参数,修改查询语句如下:
const findCommentsByIds = `-- name: FindCommentsByIds :many select c.id, c.created_at, c.updated_at, c.content, c.post_id, c.author_id from TB_COMMENTS c where c.id in ($1:list) `
此时sqlc会自动生成接收[]int64参数的方法:
func (q *Queries) FindCommentsByIds(ctx context.Context, id []int64) ([]TbComment, error) { // 自动生成的正确查询逻辑 }
方案2:修正ANY语法的类型转换
如果坚持使用ANY语法,需将数组类型指定为bigint[](对应Go的int64),而非int[]:
const findCommentsByIds = `-- name: FindCommentsByIds :many select c.* from TB_COMMENTS c where c.id = ANY ($1::bigint[]) `
这样sqlc会正确识别参数类型为[]int64,生成符合预期的方法。
关键提示
PostgreSQL中BIGSERIAL本质是bigint类型的自增字段,对应的数组类型必须是bigint[],sqlc会严格遵循SQL类型定义映射Go类型,确保类型匹配才能生成正确参数。
内容的提问来源于stack exchange,提问作者TalesMGodois
相关产品推荐
相关产品推荐

