【问题标题】:Postgres SELECT in Go returns all columns as string (using pq and database/sql)Go 中的 Postgres SELECT 将所有列作为字符串返回(使用 pq 和数据库/sql)
【发布时间】: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


【解决方案1】:

当使用functionout 参数时,它只返回一行,我遇到了同样的问题。以下为我解决了它:

var foo, bar string
err := db.QueryRow("select * from my_function()").Scan(&foo, &bar)

function 是这种形式:

create or replace function my_function(
  out first_out varchar,
  out second_out json
) as $$
  -- etc.
$$ language plpgsql;

【讨论】:

    【解决方案2】:

    感谢 a_horse_with_no_name 的正确答案!我把它贴在这里是为了……后代?

    在 Postgres 中,使用括号执行 SELECT (a, b) 会返回一条记录,这是一种匿名复合类型。删除括号将单独返回列:Select a, b

    【讨论】:

      猜你喜欢
      • 2019-12-17
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 2020-04-23
      • 2016-07-31
      • 2013-06-08
      相关资源
      最近更新 更多