当我尝试拨打电话时收到以下错误
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 时,相同的查询工作正常。
知道这里出了什么问题吗?预先感谢。
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
包含四个元素,但查询返回两列,因此我不太确定您打算如何填充其他两列(或映射是什么)。
发生此错误的原因是您的结构体属性名称与查询执行后生成的列名称不匹配。例如,如果执行查询后的列名是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)
}