GO:从SQL查询返回地图

时间:2016-01-02 18:21:54

标签: go

我在GO函数中查询mysql数据库,并希望在地图中返回键值对,但无法弄清楚如何完成此操作。到目前为止,我有这个功能:

func GetData(callIds []string) map[string]Records {
    //db insert
    db, err := sql.Open("mysql", mySql)
    if err != nil {
        fmt.Printf(err.Error())
    }
    defer db.Close()
    //db query
    var foo string
    err = db.QueryRow("select foo from bardata where callId = %v", 1).Scan(&foo)
    if err != nil {
        fmt.Printf(err.Error())
    }
    fmt.Println(foo)

    return nil

我想返回一个地图,其中密钥为callId,值为foo,表示查询返回的每一行。

2 个答案:

答案 0 :(得分:1)

首先,您需要构建查询。实际上,你甚至没有使用你的功能输入。由于我们有不同数量的参数,我们需要做一些工作来构建合适数量的占位符:

query := `select callid, foo from bardata where callid in (` +
    strings.Repeat(`?,`, len(callIds) - 1) + `?)`

然后,使用传入的值执行:

rows, err := db.Query(query, callIds...)
if err != nil {
    // handle it
}
defer rows.Close()

然后收集结果:

ret := map[string]string{}
for rows.Next() {
    var callid, foo string
    err = rows.Scan(&callid, &foo)
    if err != nil {
        // handle it
    }
    ret[callid] = foo
}

return ret

注意事项:

  1. 如果callIds为空切片,则会导致占位符不匹配错误。如果可能,那么你需要检测它并单独处理它(可能是通过返回错误或空地图 - 不需要查询数据库)。

  2. 这会返回一个map[string]string,其中的值是" foo"是。在您的问题中,您的函数返回map[string]Records,但没有关于Records可能是什么或如何获取的信息。

  3. 您可能希望以不同于其他错误的方式处理sql.ErrNoRows

答案 1 :(得分:0)

mpi_group_world

输出:

&map [col1:abc col2:123]