我一直试图在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的切片。
遇到了类似的问题。我不记得我是在哪里发现的,但我记得在处理integer和string类型的数组时仍然遇到了问题。我要做的是有一个本地自定义类型,并为它返回一个与驱动程序兼容的值。
// Int64Array is a type implementing the sql/driver/value interface
// This is due to the native driver not supporting arrays...
type Int64Array []int64
// Value returns the driver compatible value
func (a Int64Array) Value() (driver.Value, error) {
var strs []string
for _, i := range a {
strs = append(strs, strconv.FormatInt(i, 10))
}
return "{" + strings.Join(strs, ",") + "}", nil
}
强烈建议查看sqlx。写了一个简单的orm包装纸,叫做papergres,让我的go+postgres生活更轻松:)试试看。
不是?,使用$1、$2等作为占位符有效。