Pointers 扫描错误:sql:列索引11上的扫描错误:目标不是指针
我知道问题是什么,当我试图扫描数据库调用中的字段时,我没有提供指针地址-但是在这种情况下,我不太确定如何解决它 我有一个结构,看起来像这样:Pointers 扫描错误:sql:列索引11上的扫描错误:目标不是指针,pointers,dictionary,go,struct,Pointers,Dictionary,Go,Struct,我知道问题是什么,当我试图扫描数据库调用中的字段时,我没有提供指针地址-但是在这种情况下,我不太确定如何解决它 我有一个结构,看起来像这样: type ItemsRequest struct { Sku string `json:"sku"` Name string `json:"name"` Barcode string `json:"barcode,omitempty"` Category struct { ID
type ItemsRequest struct {
Sku string `json:"sku"`
Name string `json:"name"`
Barcode string `json:"barcode,omitempty"`
Category struct {
ID string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Subcategories []interface{} `json:"subcategories,omitempty"`
CategoryPosition int `json:"categoryPosition,omitempty"`
ResourceURI string `json:"resource_uri,omitempty"`
} `json:"category,omitempty"`
CategoryPosition int `json:"categoryPosition,omitempty"`
LongDesc string `json:"longDesc,omitempty"`
MinQty int `json:"minQty,omitempty"`
MultQty int `json:"multQty,omitempty"`
UnitPrice string `json:"unitPrice,omitempty"`
ImageURLs []string `json:"imageURLs,omitempty"`
Variants []interface{} `json:"variants,omitempty"`
AdditionalPrices map[string]string `json:"additionalPrices,omitempty"`
audtdatetime int
}
AdditionalPrices
字段用于表示价值对象,例如:
{
'UK': "12.34",
'AU': "14.00"
}
因此,我很有信心字段的map[string]string
类型是正确的
我正在从数据库检索数据以填充此结构,然后尝试将结果扫描到此结构的实例中。在我的查询中,我有一个预定义的列数,我想用它来填充AdditionalPrices
因此,我从以下内容开始:
func getItemsFromDB() []*ItemsRequest {
rows, err := bcdataDBConnection.Query(`
SELECT *
FROM vProducts
WHERE max_audit_date_time > @AuditTime
`, sql.Named("AUDITTIME", 2016101412000000))
if err != nil {
log.Fatal("There was an issue with the query for items: ", err)
}
defer rows.Close()
var items []*ItemsRequest
for rows.Next() {
var item = &ItemsRequest{}
err := rows.Scan(
&item.Sku,
&item.Name,
&item.Category.ID,
&item.Category.Name,
&item.Category.CategoryPosition,
&item.LongDesc,
&item.Barcode,
&item.UnitPrice,
&item.MinQty,
&item.MultQty,
&item.CategoryPosition,
&item.AdditionalPrices["NZBASE"],
&item.AdditionalPrices["NZWWW"],
&item.AdditionalPrices["MMCMFR"],
&item.AdditionalPrices["MMBASE"],
&item.AdditionalPrices["AUBASE"],
&item.AdditionalPrices["MMCMAU"],
&item.AdditionalPrices["AUDSA"],
&item.AdditionalPrices["AUDVIC"],
&item.AdditionalPrices["AUDWWW"],
&item.audtdatetime,
)
if err != nil {
log.Fatal("Scan error: ", err)
}
items = append(items, item)
}
return items
}
但是,这似乎不是正确的语法,因此我将其更改为:
func getItemsFromDB() []*ItemsRequest {
rows, err := bcdataDBConnection.Query(`
SELECT *
FROM vHandshakeProducts
WHERE max_audit_date_time > @AuditTime
`, sql.Named("AUDITTIME", 2016101412000000))
if err != nil {
log.Fatal("There was an issue with the query for items: ", err)
}
defer rows.Close()
var items []*ItemsRequest
for rows.Next() {
var item = &ItemsRequest{}
err := rows.Scan(
&item.Sku,
&item.Name,
&item.Category.ID,
&item.Category.Name,
&item.Category.CategoryPosition,
&item.LongDesc,
&item.Barcode,
&item.UnitPrice,
&item.MinQty,
&item.MultQty,
&item.CategoryPosition,
item.AdditionalPrices["NZBASE"],
item.AdditionalPrices["NZWWW"],
item.AdditionalPrices["MMCMFR"],
item.AdditionalPrices["MMBASE"],
item.AdditionalPrices["AUBASE"],
item.AdditionalPrices["MMCMAU"],
item.AdditionalPrices["AUDSA"],
item.AdditionalPrices["AUDVIC"],
item.AdditionalPrices["AUDWWW"],
&item.audtdatetime,
)
if err != nil {
log.Fatal("Scan error: ", err)
}
items = append(items, item)
}
return items
}
这是我的IDE更喜欢的,但是运行它时,我得到了错误:
2018/01/15 15:35:06扫描错误:sql:列索引11上的扫描错误:目标不是指针
因此,在这一点上,我不太确定如何从我的数据库调用中填充AdditionalPrices
的值
我需要怎么做才能用我从数据库获得的值填充AdditionalPrices
映射?
根据代码中的键,我已经知道要为其分配值的映射键。行。扫描是指扫描DB行中的字段。它无法以嵌套方式扫描字段的值 因此,只需说
&item.AdditionalPrices
即可扫描每行的AdditionalPrices
字段,如下所示:
err := rows.Scan(
&item.Sku,
&item.Name,
&item.Category.ID,
&item.Category.Name,
&item.Category.CategoryPosition,
&item.LongDesc,
&item.Barcode,
&item.UnitPrice,
&item.MinQty,
&item.MultQty,
&item.CategoryPosition,
&item.AdditionalPrices,
&item.audtdatetime,
)
谢谢如果它的类型为
map[string]string
那么它如何获取密钥?使用的数据库引擎是什么?数据库字段additionalPrices
的类型是什么?数据库是sql server,列类型是decimal(9,2)。我认为additionalPrices
的类型类似于JSON。如果每个额外的价格都有单独的十进制类型列,那么使用map[string]interface{}
进行扫描是不可能的,这很麻烦。我只需要扫描到一个临时变量,然后手动构建映射。无论如何,谢谢你的帮助。