列索引 0 上扫描错误,名称“ID”:不支持扫描,将 driver.Value 类型 int64 存储到类型 *[]authService.Permission”

问题描述 投票:0回答:2

当我尝试拨打电话时收到以下错误

err = row.Scan(&resourceList, resourceTypeId)

列索引 0 上的扫描错误,名称“ID”:不支持扫描,将 driver.Value 类型 int64 存储到类型 *[]authService.Permission”

type Permission struct {
    ID               int    `json:"id"`
    Name             string `json:"name"`
    Description      string `json:"description"`
    ParentResourceID int    `json:"parentResourceId"`
}

func GetResourcesByResourceTypeId(resourceTypeId string) ([]Permission, string, error) {
db, ctx := db.GetDB()
query := "CALL usp_GetParentResourceListByResourceTypeID(?)"
var resourceList []Permission
stmt, err := db.Prepare(query)
defer stmt.Close()
if err != nil {
    log.Errorln("Error in preparing statement. " + err.Error())
    return nil, "Error in preparing statement.", err
}

row := stmt.QueryRowContext(ctx, resourceTypeId)

err = row.Scan(&resourceList, resourceTypeId)
if err == nil {
    return resourceList, "Resource retrieval.", nil
}

log.Warningln("Resource retrieval failed, ResourceTypeID: " + resourceTypeId + ".")
return resourceList, "Resource retrieval failed.", nil
}

SQL 返回如下

ID  Name
15  Applications
16  Subscriptions
17  Payments

当我尝试在

EXEC
中使用带有
query
语句的 SQL Server 时,相同的查询工作正常。

知道这里出了什么问题吗?预先感谢。

mysql go call
2个回答
2
投票

这里有几个问题。首先

QueryRowContext

执行预计最多返回一行的查询

您的问题表明您的语句返回多个结果,因此这不是正确使用的函数(

QueryContext
会更合适)。

第二个问题如错误中所述:

不支持扫描,将 driver.Value 类型 int64 存储到类型 *[]authService.Permission"

结果集中的第一列是一个整数(在本例中可能是值

15
),您尝试将其扫描到
[]Permission
中。如果你改变了
var resourceList []Permission
var resourceList int
该错误将被修复(但第二个参数也需要工作)。

查看文档中的此示例。获取该代码并将其应用到您的情况将导致类似以下内容(未经测试;只是为了向您指出正确的方向):

rows, err := db.QueryContext(ctx, "CALL usp_GetParentResourceListByResourceTypeID(?)", resourceTypeId)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

var resourceList []Permission

for rows.Next() {
    var resource Permission
    if err := rows.Scan(&resource.ID, &resource.Name); err != nil {
        // Check for a scan error.
        // Query rows will be closed with defer.
        log.Fatal(err)
    }
    resourceList = append(resourceList, resource )
}

rerr := rows.Close()
if rerr != nil {
    log.Fatal(rerr)
}

if err := rows.Err(); err != nil {
    log.Fatal(err)
}

注意: 您的结构

Permission
包含四个元素,但查询返回两列,因此我不太确定您打算如何填充其他两列(或映射是什么)。


0
投票

发生此错误的原因是您的结构体属性名称与查询执行后生成的列名称不匹配。例如,如果执行查询后的列名是book_name,那么struct属性应该是BookName。

这是示例代码:

package controllers

import (
    "encoding/json"
    "fmt"
    "my-app/models"
    "net/http"
)

type Book struct {
    ID          uint
    BookName    string
}

func GetBookById(w http.ResponseWriter, r *http.Request) {
    book_id := "10"
    var books models.Book
    query := models.Db.Select("books.name as book_name").Where("id = ?", book_id).Scan(&books)

    if query.Error != nil {
        fmt.Println("query.Error: ", query.Error)
    }
    json.NewEncoder(w).Encode(books)
}
© www.soinside.com 2019 - 2024. All rights reserved.