我正在尝试将可变数量的参数传递给Go中的db.Query()。我正在做类似的事情:
var values []interface{}
query := []string{"SELECT * FROM table"}
sep := "WHERE"
if ... {
values = append(values, something)
query = append(query, fmt.Sprintf(` %s field_a=$%d`, sep, len(values))
sep = "AND"
}
if ... {
values = append(values, something)
query = append(query, fmt.Sprintf(` %s field_b=$%d`, sep, len(values))
sep = "AND"
}
// Add an arbitrary number of conditional arguments...
rows, err := db.Query(strings.Join(query, " "), values...)
查询看起来很好,值都在那里,但我没有从查询中得到任何回报。一些值是整数,一些字符串。当我在psql中手动尝试完全相同的查询(复制/粘贴)时,我将实际值替换为$ 1,$ 2等,我得到了正确的结果。我错过了什么?
修改
以下是最终查询(strings.Join()
)的结果应如下所示的示例:
SELECT
table1.field1, table1.field2, table1.field3,
table2.field4, table2.field6, table2.field6
FROM table1, table2
WHERE
table1.field2=$1 AND
table2.field3 IN ($2, $3)
当我尝试:
SELECT
table1.field1, table1.field2, table1.field3,
table2.field4, table2.field6, table2.field6
FROM table1, table2
WHERE
table1.field2='something' AND
table2.field3 IN (40, 50)
来自psql
的,它运作正常。我打电话的时候:
var values []interface{}
values = append(values, "something")
values = append(values, 40)
values = append(values, 50)
db.Query(`SELECT
table1.field1, table1.field2, table1.field3,
table2.field4, table2.field6, table2.field6
FROM table1, table2
WHERE
table1.field2=$1 AND
table2.field3 IN ($2, $3)`, values...)
来自Go的,我得到一个Rows对象,在第一次调用false
时返回rows.Next()
,并且出现nil错误。