使用pq.Array时Gorm的IN条件查询失效问题求助
解决方案
方法1:将pq.StringArray转为普通string切片
Gorm对原生string切片处理IN条件会自动生成正确的逗号分隔列表,把task.Files转成普通切片后再查询即可:
// 转换pq.StringArray为string切片 fileIDs := make([]string, len(task.Files)) copy(fileIDs, task.Files) // 执行查询 db.Where("id IN ?", fileIDs).Find(&files)
生成的正确SQL:
SELECT * FROM files WHERE id IN ('cb71f854-71fc-4849-9783-71cf8f8e4214')
方法2:使用PostgreSQL的=ANY操作符
pq.StringArray对应PostgreSQL的数组类型,直接用原生=ANY操作符可直接匹配数组元素,无需转换:
db.Where("id = ANY(?)", task.Files).Find(&files)
生成的合法SQL:
SELECT * FROM files WHERE id = ANY('{"cb71f854-71fc-4849-9783-71cf8f8e4214"}'::text[])
问题原因
pq.StringArray会被Gorm序列化为PostgreSQL数组字面量(带{}格式),但IN操作符需要逗号分隔的单个值列表,两者语法不兼容。上述两种方法分别从适配IN语法、适配PostgreSQL数组语法的角度解决了问题。
内容的提问来源于stack exchange,提问作者Fazliddin Nabijonov
相关产品推荐
相关产品推荐

