Go语言中的PostgreSQL列表参数(使用database/SQL和pq)

jgzswidk  于 2022-12-12  发布在  PostgreSQL
关注(0)|答案(5)|浏览(222)

我正在尝试写一个查询,该查询使用一个列表参数(即,一个值列表的单个参数)。看起来这在PostgreSQL(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不支持,或者PostgreSQL根本不支持,还是什么?

relj7zay

relj7zay1#

现在可以使用带切片参数的pq.Array,因此查询如下所示:

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

cngwdvgl2#

因此,pq似乎使用了database/sql的默认ValueConverter,它没有处理切片的能力(请参阅DefaultParameterConverter的文档)。

dkqlctbz

dkqlctbz3#

由于语法错误,我无法使用已接受的答案。我对答案进行了一些修改,使其对我有效。
我使用的资源是pq.Array函数文档。

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

fsi0uk1n4#

看看使用另一个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"},
)

(我自己没有用过,但看了一眼就知道了)。

dphi5xsq

dphi5xsq5#

事实上,这看起来确实是“有气质的”。下面是我会尝试的两个方法:
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})

相关问题