在golang

时间:2017-10-12 03:16:14

标签: postgresql go in-clause

我一直在尝试在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,其长度是可变的。

2 个答案:

答案 0 :(得分:0)

而不是?,使用$ 1,$ 2等作为占位符工作。

答案 1 :(得分:0)

陷入类似的问题。无法记住我在哪里选择了它,但我记得在处理整数与字符串类型的数组时仍遇到问题。我必须做的是拥有一个本地自定义类型并返回一个驱动程序兼容的值。见下面的示例。

// 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。写了一个名为papergres的简单orm包装器,让我的go + postgres生活更轻松:)尝试一下。