sql:转换参数$ 1 type:unsupported type [] int,in slice of in

问题描述 投票:1回答:2

拥有这个:

somevars := []int{1, 2, 3, 4}
rows, err = db.Query("SELECT c1,c2 FROM table"+tid+" WHERE c1 IN($1,$2,$3,$4);", somevars)

明白啦:

sql:转换参数$ 1类型:unsupported type [] int,一个int片

任何使用lib / pq进行切片的方法都可以吗?

postgresql go
2个回答
5
投票

另一种解决方案是

somevars := []interface{}{1, 2, 3, 4}
rows, err = db.Query(
    "SELECT c1,c2 FROM table"+tid+" WHERE c1 IN($1,$2,$3,$4);",
    somevars...)

在这里,...将切片扩展为多个参数,类似于python *args。它记录了in the language spec

db.Query API支持这种所谓的可变参数。

func (db *DB) Query(query string, args ...interface{}) (*Rows, error)

这里interface{}被称为空接口,它可以保存任何类型的值。见Go tour example here。所以可以像使用它一样

db.Query(stmt, var1, var2)

其中var1 var2可能是不同类型的。

在您的情况下,您还可以显式传递切片元素

db.Query(stmt,
         somevars[0], somevars[1], somevars[2], somevars[3])

但它相当冗长,并且在切片长度变化时需要额外的工作。

请注意,如果不使用interface切片somevars,我们使用intvars := []int {1, 2, 3, 4}并在intvars中展开db.Query(),编译器会抱怨intvars...

不能在赋值时使用[] int literal(type [] int)作为类型[] interface {}

类型转换intvars.([]interface{})也不起作用。这在language spec FAQ中有记载。还有一个dedicated wiki page for it

语言规范不允许它,因为这两种类型在内存中没有相同的表示。

golang interface的直观图片是一个有两个字段的对象,一个字段存储一个类型,另一个存储指针。


4
投票

pq.Array是答案:

somevars := []int{1, 2, 3, 4}
rows, err = db.Query("SELECT c1,c2 FROM table"+tid+" WHERE c1 = any($1);", pq.Array(somevars))
© www.soinside.com 2019 - 2024. All rights reserved.