H5W3
当前位置:H5W3 > 其他技术问题 > 正文

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)
    }

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

回答:

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

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

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

回答:

sqlmapper: https://github.com/arthas29/s…非常轻量,一个go文件就搞定
原理就是用go的反射,这样就不用去写sql字符串了,很方便

回答:

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]

回答:

逻辑很清楚,见注释吧rows转map

本文地址:H5W3 » go语言如何把mysql查询的数据保存到结构体或者map啊?

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址