【发布时间】:2014-01-24 11:45:17
【问题描述】:
我正在使用 database/sql 包和 pq Postgres 驱动程序在 Go 中进行选择:
rows, err := db.Query("SELECT (name, age) FROM people WHERE id = 1")
我尝试以正常方式检索值:
rows.Next()
name := ""
age := 0
err = rows.Scan(&name, &age)
但我得到了错误:
sql: expected 1 destination arguments in Scan, not 2
sql.(*Rows).Scan 的文档说你可以传递一个字节切片指针,它将被原始结果填充。所以我这样做了:
b := make([]byte, 1024*1024)
rows.Scan(&b)
fmt.Println(string(b))
成功了,正在打印:
(John,18)
所以我查看了sql.(*Rows).Scan 的源代码,结果发现如果参数的数量与数据库驱动程序返回的结果数量不匹配(这是有道理的),则会返回错误。因此,出于某种原因,pq 驱动程序似乎将结果集作为单个值返回。为什么会这样?
【问题讨论】:
-
删除选择列表中列周围的括号。
SELECT (name, age)返回单个记录(匿名复合类型),但SELECT name, age将返回两列 -
这是 Postgres 独有的功能吗?
-
@joshlf13 您可能需要查看标准才能找到答案,而且阅读起来很“有趣”。我认为标准支持
UPDATE ... SET (a, b) = (x, y)之类的东西,而 PostgreSQL 只是通过将(a,b)视为ROW(a,b)的简写来概括这一点。 -
@a_horse_with_no_name :但是如果查询正在调用返回查询的函数怎么办,例如
RETURN QUERY SELECT arg1, arg2删除括号不适用于函数 -
@Joe:不知道你的意思。如果您随后运行
select * from function(),则无需删除任何括号
标签: postgresql select go rows