【发布时间】:2018-03-23 20:58:37
【问题描述】:
我一直在尝试在 golang 中使用 postgres IN 子句,但一直出错。这是我要执行的查询。
SELECT id1 FROM my_table WHERE type = (an int) AND id2 = (an int) AND id1 IN (list of UUIDs)
我使用这段代码构造了这个查询,但得到了以下错误。
var params []interface{}
inCondition := ""
params = append(params, type)
params = append(params, id2)
for _, id := range id1 {
params = append(params, id)
if inCondition != "" {
inCondition += ", "
}
inCondition += "?"
}
query := fmt.Sprintf(`SELECT id1 FROM my_table WHERE type = ? AND id2 = ? AND id1 IN (%s)`, inCondition)
rows, err := db.Query(query, params...)
我得到的查询:
SELECT id1 FROM my_table WHERE type = ? AND id2 = ? AND id1 IN (?, ?, ?)
参数输出:
[]interface {}=[0 7545449 d323f8d5-ab97-46a3-a34e-95ceac2f3a6a d323f8d5-ab97-46a3-a34e-95ceac2f3a6b d323f8d5-ab97-46a3-a34e-95ceac2f3a6d]
错误:
pq: syntax error at or near \"AND\""
我错过了什么?或者,我将如何让它工作? id1 是长度可变的 UUID 切片。
【问题讨论】:
-
从不使用字符串插值来构建查询。至少在没有仔细引用所有内容的情况下并非如此。这是大规模的 SQL 注入诱饵。请改用绑定参数。例如godoc.org/github.com/lib/pq#Array
-
你在使用
lib/pq吗?对于参数的占位符,请尝试$1, $2...,而不是?。 -
你能显示整个结果查询吗?可能在数据库错误日志中。尝试对 IN 查询使用特殊插值。
标签: postgresql go in-clause