从PostgreSQL查询整数数组总是返回[]uint8

9

假设有一个简单的PostgreSQL数据库,其中包含一个整数数组:

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
[]

你正在使用 []int,但错误提示为 *[]int64。你确定你的代码与错误信息匹配吗? - Jonathan Hall
2个回答

18
您不能将int的切片用作driver.Value。传递给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)

0
如果您使用获取多行的方式,问题将更加严重。 上述代码适用于单行,要获取多行,请使用以下方式:
``` rows, err := db.QueryContext(ctx, stmt, courseCode) if err != nil { return nil, err } defer rows.Close() ```
var feedbacks []*Feedback1

for rows.Next() {
    var feedback Feedback1
    var ret pq.Int64Array
    var ret1 pq.Int64Array
    err := rows.Scan(
        &feedback.ID,
        &ret,
        &ret1,
    )
    if err != nil {
        return nil, err
    }

    //for loop to convert int64 to int
    for i:=0;i<len(ret);i++{
        feedback.UnitFeedback = append(feedback.UnitFeedback,int(ret[i]))}

    for i:=0;i<len(ret1);i++{
        feedback.GeneralFeedback = append(feedback.GeneralFeedback,int(ret1[i]))}

    feedbacks = append(feedbacks, &feedback)
}`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接