Golang从sql查询为多维结构赋值

时间:2016-10-06 01:45:28

标签: go

我想将从SQL查询返回的值分配给多维结构。我想将这个多维结构作为JSON输出到Web前端。

编辑:SQL查询很简单,'SELECT * FROM policy'。它会返回许多键/值,但出于示例的目的,我只使用'policy_id','class_id'和'name'字段。

我的结构

    type table struct {
    Policy string `json:"policy"`
    P []Parameters `json:"parameters"`
    }

    type Parameters struct {
    Policy_id string `json:"policy_id"`
    Class_id string `json:"class_id"`
    Name string `json:"name"`
    .... <removed many more entries of the same type>
    }

然后我使用rows.Next()//循环访问SQL输出//对问题不重要。

如果我这样做:

p := Parameters{}

然后:

err = rows.Scan(&p.Policy_id, &p.Class_id, &p.Name)

p填充了我期望的键/值对。

编辑:我添加了p.Name,因为我想使用从查询字符串返回的Name作为表结构的唯一键。之前并不清楚。

但是,我想将数据放入更高级别的struct'table'。我最终希望输出在JSON中看起来像这样:

{policy:“policyName1”,P:[{policy_id:'1',class_id:'01“},{policy_id:'2',class_id:'02'}等}}

我尝试过这样的事情:

t := table {
Policy: p.Name,
P: p,
}

以及其他一些组合,但此时我只是在猜测。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

可能是这样的:

// a map with policy name as key
ts := map[string]tables

defer rows.Close()
for rows.Next() {
    p := Parameters{}
    if err := rows.Scan(&p.Policy_id, &p.Class_id, &p.Name); err != nil {
        log.Fatal(err)
    }

    // initialize the table, if not exists
    if _, ok := ts[p.Name]; !ok {
        ts[p.Name] = table{
            Policy: p.Name,
            P: make([]Parameters),
        }
    }

    // append the parameters to the policy
    ts[p.Name].P = append(ts[p.Name].P, p)
}