为了账号安全,请及时绑定邮箱和手机立即绑定

在 db.Query 中使用 bindvars 获得不同的结果

在 db.Query 中使用 bindvars 获得不同的结果

Go
湖上湖 2022-12-26 16:39:33
去版本:18.3 github.com/go-sql-driver/mysql v1.6.0当查询字符串是 db.Query("SELECT * FROM logs ORDER BY log_id DESC LIMIT 1,3 ")如果 log_id == 8b, _ := rawValue.([]byte)下面是vscode的调试信息,b是正确的b: []uint8 len:1,cap 1,[56] ; 字符串():“8”当我使用 db.Query("SELECT * FROM logs ORDER BY log_id DESC LIMIT ?,? ", 1,3)如果 log_id == 8在b, _ := rawValue.([]byte)信息是b: []uint8 only :0 ,cap:0 ,nil原始值8不是56和 user(string) 在两者中都运行良好。我的 SQL 架构CREATE TABLE logs (    `log_id` INT(6) NOT NULL AUTO_INCREMENT,   `user` VARCHAR(10),  PRIMARY KEY(log_id)      );代码    db, _:= sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/log")    rows, _ := db.Query("SELECT * FROM logs ORDER BY log_id DESC LIMIT ?,? ", 1, 3)    col, _ := rows.Columns()    defer rows.Close()    count := len(col)    values := make([]interface{}, count)    for i := range values {        var ii interface{}        values[i] = &ii    }    ret := make([]map[string]interface{}, 0)    fmt.Println("Reading data:")    for rows.Next() {        _ = rows.Scan(values...)        m := make(map[string]interface{}, 0)        for i, colname := range col {            rawValue := *(values[i].(*interface{}))            b, _ := rawValue.([]byte)            if colname == "log_id" {                v, _ := strconv.Atoi(string(b))                m[colname] = v            } else if colname == "log_msg_id" {                v, _ := strconv.Atoi(string(b))                m[colname] = v            } else {                v := string(b)                m[colname] = v            }        }
查看完整描述

1 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

为什么不把值扫描成这样的结构:


type Log struct {

        ID   int64

        Name string

    }


    db, _ := sql.Open("mysql", "root:passwd@tcp(127.0.0.1:3306)/log")

    rows, err := db.Query("SELECT * FROM logs ORDER BY log_id DESC LIMIT ?,? ", 1, 3)

    if err != nil {

        fmt.Println(err)

    }


    defer rows.Close()

    var values []Log


    fmt.Println("Reading data:")

    for rows.Next() {

        var log Log

        err = rows.Scan(&log.ID, &log.Name)

        if err != nil {

            fmt.Println(err)

            continue // you need to handle error

        }


        values = append(values, log)

    }

    fmt.Println(values)


查看完整回答
反对 回复 2022-12-26
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号