为了账号安全,请及时绑定邮箱和手机立即绑定

不支持的扫描:SQL UUID 数组

不支持的扫描:SQL UUID 数组

Go
哆啦的时光机 2021-12-27 10:45:39
我试图UUID从 PostgreSQL 数据库中获取一个数组,这给出了以下错误:sql: Scan error on column index 0: unsupported Scan, storing driver.Value type []uint8 into type *[]string获取单个UUID没有问题,但是当它是 an 时array,该Scan函数将元素的类型推断为uint8。是否有解决方法/解决方案?或者我应该重新考虑我的数据库?代码 :func FetchListIdsForUser(id string, db *sql.DB) ([]string, error) {        // where the results will be stored        var (            lists []string        )        // statement prep        stmt, err := db.Prepare("select lists from users where object_id = $1")            if err != nil {            formattedError := er.New("FetchListIdsForUser SQL Select: " + err.Error())            log.Println(formattedError)            return nil,formattedError        }        defer stmt.Close()        // query happening        rows, err := stmt.Query(id)        if err != nil {            formattedError := er.New("FetchListIdsForUser SQL Query: " + err.Error())            log.Println(formattedError)            return nil,formattedError        }        defer rows.Close()        // for each row        for rows.Next() {            // scan : this is where the error happens.            err := rows.Scan(&lists)            if err != nil {                formattedError := er.New("FetchListIdsForUser SQL Scan: " + err.Error())                log.Println(formattedError)                return nil,formattedError            }            return lists,nil        }        err = rows.Err()        if err != nil {            formattedError := er.New("FetchListIdsForUser: " + id + " Does Not Exist")            log.Println(formattedError)            return nil,formattedError        }        return nil,er.New("FetchListIdsForUser: " + id + " Does Not Exist")}
查看完整描述

1 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

您的代码可以简化很多:


func FetchListIdsForUser(id string, db *sql.DB) ([]string, error) {


        rows, err := db.Query("SELECT unnest(lists) FROM users WHERE object_id = $1", id)

        if err != nil { 

            formattedError := errors.New("FetchListIdsForUser SQL Query: " + err.Error())

            return nil, formattedError

        }


        defer rows.Close()


        var lists []string

        var list string


        for rows.Next() {

            // scan every item of the array and append it to lists

            err := rows.Scan(&list)

            if err != nil {

                formattedError := errors.New("FetchListIdsForUser SQL Scan: " + err.Error())

                return nil,formattedError

            }

            lists = append(lists, list)

        }


        if lists == nil {

            // no rows returned

            formattedError := errors.New("FetchListIdsForUser: " + id + " Does Not Exist")

            return nil, formattedError

        }


        return lists, nil

}

  • db.Query()将为您准备(并缓存)该语句。无需手动执行此操作。

  • 我添加unnest(lists)到 select 语句中。这将为数组中的每个元素生成一行。

  • 在 for 循环中,我们单独扫描每个元素并将其附加到lists.

此外,该驱动程序支持开箱即用的扫描阵列。


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 358 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信