猿问

GO:从 SQL 查询返回地图

我正在 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。


长风秋雁
浏览 171回答 2
2回答

凤凰求蛊

首先,您需要建立您的查询。实际上,您甚至没有使用函数输入。由于我们有可变数量的参数,我们需要做一些工作来构造正确数量的占位符: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注意事项:如果callIds是空切片,这将导致占位符不匹配错误。如果可能,那么您需要检测它并单独处理它(可能通过返回错误或空映射 - 不需要查询数据库)。这将返回一个map[string]string值是“foo”的任何值。在您的问题中,您有返回 a 的函数,map[string]Records但没有关于 aRecords可能是什么或如何获取a 的信息。您可能希望以sql.ErrNoRows与其他错误不同的方式处理。

慕桂英3389331

package mainimport (    "fmt"    "github.com/bobby96333/goSqlHelper")func main(){    fmt.Println("hello")    conn,err :=goSqlHelper.MysqlOpen("user:password@tcp(127.0.0.1:3306)/dbname")    checkErr(err)    row,err := conn.QueryRow("select * from table where col1 = ? and  col2 = ?","123","abc")    checkErr(err)    if *row==nil {        fmt.Println("no found row")    }else{        fmt.Printf("%+v",row)    }}func checkErr(err error){    if err!=nil {        panic(err)    }}输出:&map[col1:abc col2:123]
随时随地看视频慕课网APP

相关分类

Go
我要回答