扫描错误:sql:列索引11上的扫描错误:目标不是指针

时间:2018-01-15 05:47:17

标签: pointers dictionary go struct

我明白问题是什么,当我尝试从数据库调用中扫描字段时,我没有提供指针地址 - 但是在这种情况下我不太确定如何解决它。

我有一个看起来像这样的结构:

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地图需要做什么? 根据我的代码中的键,我已经知道了我想为其分配值的映射键。

1 个答案:

答案 0 :(得分:1)

row.Scan用于扫描数据库行中的字段。它无法以嵌套方式扫描字段的值。

所以只需说&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,
    )