Go中的Postgres列表参数(使用database / sql和pq)

时间:2014-01-04 23:49:18

标签: sql postgresql go prepared-statement query-parameters

我正在尝试编写一个带有list参数的查询(即一个参数,它是一个值列表)。看来这在Postgres中至少有时是可能的(https://stackoverflow.com/a/10829760/836390)。我想要的是这样的:

rows, err := db.Query("SELECT * FROM table WHERE id in $1", []int{1, 2, 3})

但是,当我使用pq驱动程序执行此操作时,出现错误:

sql: converting Exec argument #0's type: unsupported type []int, a slice

这在pq中是否仍然不受支持,或database/sql不支持,或者Postgres根本不支持,或者什么?谢谢!

5 个答案:

答案 0 :(得分:6)

因此看起来pq使用database/sql的默认ValueConverter,它无法处理切片(请参阅Default documentation以获取DefaultParameterConverter)。

答案 1 :(得分:1)

使用另一种Postgres客户端:https://github.com/vmihailenco/pg

自述文件详细信息数组支持并包含使用切片的示例。

    _, err := db.Query(users,
    `WITH users (name, emails) AS (VALUES (?, ?), (?, ?))
    SELECT * FROM users`,
    "admin", []string{"admin1@admin", "admin2@admin"},
    "root", []string{"root1@root", "root2@root"},
)

(我自己并没有使用过这个,但是看看它有希望)。

答案 2 :(得分:1)

如今,您可以将pq.Array与切片参数一起使用。因此查询如下所示:

rows, err := db.Query("SELECT * FROM table WHERE id in $1", pq.Array([]int{1, 2, 3}))

答案 3 :(得分:0)

事实上,这似乎是“气质”。以下是我要尝试的两个:

rows, err := db.Query("SELECT * FROM table WHERE id in ($1)", []int{1, 2, 3})

rows, err := db.Query("SELECT * FROM table WHERE id = ANY($1::[]int)", []int{1, 2, 3})

答案 4 :(得分:0)

由于语法错误,我无法获得可接受的答案。我对答案做了一些修改,并使其对我有用。

我使用的资源是pq.Array函数文档。

rows, err := db.Query("SELECT * FROM table WHERE id = ANY($1)", pq.Array([]int{1, 2, 3}))