go语言如何把mysql查询的数据保存到结构体或者map啊?

我用的github.com/go-sql-driver/mysql这个驱动,我像下面这样写没有报错,但是里面的数据为空或者0

type data struct {
    id int
    name string
    weight int
}
rows, _ := db.Query("select * from test where id = ?", 2)
for rows.Next() {
    line := data{}
    err = rows.Scan(&line)
    log.Println(line)
}

运行结果

2017/07/17 13:37:50 {0  0}

存到map的代码

    rows, _ := db.Query("select * from test where id = ?", 2)
    columns, _ := rows.Columns()
    length := len(columns)
    for rows.Next() {
        value := make([]interface{}, length)
        columnPointers := make([]interface{}, length)
        for i:=0;i<length;i++ {
            columnPointers[i] = &value[i]
        }
        rows.Scan(columnPointers...)
        data := make(map[string]interface{})
        for i:=0;i<length;i++ {
            columnName := columns[i]
            columnValue := columnPointers[i].(*interface{})
            data[columnName] = *columnValue
        }
        log.Print(data)
    }

有效果,但是看不懂为何要这样写

阅读 14.5k
4 个回答

你的应该报错了,你把err打出来看

就你的代码,你不能这么scan, 你应该 rows.Scan(&line.id, &line.name, &line.weight)

PS: 不想用ORM的话,你可以用 https://github.com/jmoiron/sqlx 这个包来简化一些操作。

新手上路,请多包涵
新手上路,请多包涵
package main

import (
    "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)
    }
}

output:

&map[col1:abc col2:123]

新手上路,请多包涵
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题