我正在尝试编写一个带有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根本不支持,或者什么?谢谢!
答案 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}))