golang mysql查询textRows和binaryRows解惑

1. 问题之前写了一套统一mysql返回数据的解析库:

rows, err := ms.dbInst.Query(s, args...)   //执行SQL语句,比如select * from users
if err != nil {
    panic(err)
}

columns, err := rows.Columns()   //获取列的信息
if err != nil {
    panic(err)
}
colTypes, err := rows.ColumnTypes()
if err != nil {
    panic(err)
}
count := len(columns)                     //列的数量
var values = make([]  interface {}, count)   //创建一个与列的数量相当的空接口
for i :=   range values {
    var ii   interface {}   //为空接口分配内存
    values[i] = &ii      //取得这些内存的指针,因后继的Scan函数只接受指针
}
ret := make([]  map [string]  interface {}, 0)   //创建返回值:不定长的map类型切片
for rows.Next() {
    err := rows.Scan(values...)         //开始读行,Scan函数只接受指针变量
    m := make(  map [string]  interface {})   //用于存放1列的 [键/值] 对
    if err != nil {
        panic(err)
    }
    for i, colName :=   range columns {
        //读出raw数据,类型不一定为byte,parseTime=true 时时间类型会被转化为 time.Time
         var rawValue = *(values[i].(*  interface {}))
        if rawValue == nil {
            // 如果数据查询到是nil,默认返回nil
            m[colName] = nil
            continue
        }
        m[colName] = NewValueTransferor(colTypes[i].DatabaseTypeName()).Deserialize(rawValue)
    }
    ret = append(ret, m)   //将单行所有列的键值对附加在总的返回值上(以行为单位)
}

 2. 针对不同的查询方式得到的rawValue值是不一样的:

参数在sql里面的查询:

sql3 := `select user_id from auth_order_user where order_no = 111 `
res3 := model2.Query(sql3)
fmt.Println(res3)
结果是uint8类型:

 

参数不在sql里面的查询:

sql2 := `select user_id from auth_order_user where order_no = ? `
res2 := model2.Query(sql2, "111")
fmt.Println(res2)

结果是int64:

 

 

3. 分析:

在query的时候,如果不带参数,走的是textRows;而带参数则返回,在外面跟踪的话,可以发现走的是binaryRows

textRows对返回值的解析是这样的:

可以发现只解析time类型,其他什么都不做

 

而binaryRows对返回值的解析是这样的:

会根据不同类型进行解析,整形解析成整形

posted @ 2022-12-09 17:26  若-飞  阅读(186)  评论(0)    收藏  举报