6

以一个带有整数数组的简单 PostreSQL 数据库为例:

CREATE TABLE foo (
    id                       serial PRIMARY KEY,
    bar               integer[]
);

INSERT INTO foo VALUES(DEFAULT, '{1234567, 20, 30, 40}');

使用 pq,这些值由于某种原因被检索为 []uint8 的数组。文档说整数类型作为 int64 返回
。这也不适用于数组吗?

db, err := sql.Open("postgres", "user=a_user password=your_pwd dbname=blah")
if err != nil {
    fmt.Println(err)
}

var ret []int
err = db.QueryRow("SELECT bar FROM foo WHERE id=$1", 1).Scan(&ret)
if err != nil {
    fmt.Println(err)
}

fmt.Println(ret)

输出:

sql: Scan error on column index 0: unsupported Scan, storing driver.Value type []uint8 into type *[]int64
[]
4

1 回答 1

13

您不能将 int 切片用作driver.Value. to 的参数Scan 必须支持的类型之一,或者实现sql.Scanner接口。

[]uint8在错误消息中看到的原因是从数据库返回的原始值是一个[]byte切片,它[]uint8是一个同义词。

要将切片正确解释[]byte为自定义 PostgreSQL 数组类型,您应该使用pq包中定义的适当数组类型,例如Int64Array

尝试这样的事情:

var ret pq.Int64Array
err = db.QueryRow("SELECT bar FROM foo WHERE id=$1", 1).Scan(&ret)
if err != nil {
    fmt.Println(err)
}

fmt.Println(ret)
于 2017-12-24T17:38:00.497 回答