猿问

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

去版本: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 == 8

b, _ := 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

            }


        }


湖上湖
浏览 80回答 1
1回答

偶然的你

为什么不把值扫描成这样的结构: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)
随时随地看视频慕课网APP

相关分类

Go
我要回答