2 回答
TA贡献1856条经验 获得超11个赞
func prepareWhereINString(count int) string {
var paramrefs string
for i := 0; i < count; i++ {
paramrefs += `$` + strconv.Itoa(i+1) + `,`
}
paramrefs = paramrefs[:len(paramrefs)-1] // remove last ","
return paramrefs
}
TA贡献1806条经验 获得超5个赞
如您所知,IN需要一个标量表达式列表,而不是数组,但是pgtype.Int4Array表示一个数组,而不是标量表达式列表。
“IMO 虽然这有点容易出错,因为你必须自己处理转义/sql 注入等。”
不一定,您可以遍历您的数组,构造一个参数引用字符串,将其连接到查询,然后执行它传递数组与....
var paramrefs string
ids := []interface{}{1,2,3,4}
for i, _ := range ids {
paramrefs += `$` + strconv.Itoa(i+1) + `,`
}
paramrefs = paramrefs[:len(paramrefs)-1] // remove last ","
query := `UPDATE ... WHERE id IN (` + paramrefs + `)`
pool.Exec(query, ids...)
或者,您可以使用ANY而不是IN。
ids := &pgtype.Int4Array{}
ids.Set([]int{1,2,3,4})
query := `UPDATE ... WHERE id = ANY ($1)`
pool.Exec(query, ids)
(这里你可能必须将参数引用转换为适当的数组类型,我不确定,试试不转换,如果不行,尝试转换)
- 2 回答
- 0 关注
- 100 浏览
添加回答
举报