首页 > 数据库 >golang mysql查询textRows和binaryRows解惑

golang mysql查询textRows和binaryRows解惑

时间:2022-12-09 17:35:42浏览次数:40  
标签:rows err nil textRows golang binaryRows values interface 解析

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对返回值的解析是这样的:

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

标签:rows,err,nil,textRows,golang,binaryRows,values,interface,解析
From: https://www.cnblogs.com/zhanchenjin/p/16969511.html

相关文章

  • Golang常量与变量-Go语法1
    标识符在编程语言中标识符就是程序员定义的具有特殊意义的词,就是为变量名、常量名、函数名等等取的一个见名知义的名称。Go语言中标识符由字母数字和_(下划线)组成,并且只......
  • mac下golang测试https
    1.自定义域名sudovi/etc/hosts增加自定义域名zhengzhihua.mac  保存退出   测试域名  2.生成证书脚本......
  • golang slice 和 array区别
    数组:vararr=[10]{1,2,3,4,5,6}slice:vararr=[]{1,2,3,4,5,6}array类型 array是固定长度的数组,使用前必须确定数组长度golang array 特点:golang中的数组是......
  • Golang依赖管理工具:glide从入门到精通使用
    这是一个创建于 2017-07-2205:33:09 的文章,其中的信息可能已经有所发展或是发生改变。介绍不论是开发Java还是你正在学习的Golang,都会遇到依赖管理问题。Java有牛逼轰轰......
  • 树莓派2b构建golang环境
    前言开始之前,我们先说点题外话。已经好久没有更新过技术内容了(认真脸)。一个原因是很长时间以来,一直感觉不在状态,迷茫、困惑,浑浑噩噩的,也没有分享的动力,虽然偶尔会记录一些......
  • golang编译为dll与调用dll简单样例
    ==前置准备==1、golang版本:1.182、安装MinGW(我的环境本身已经安装好了,没有验证不安装是否可以生成) ==编译为DLL==【代码样例】packagemainimport"C"//export......
  • go-dongle 0.2.0 版本发布了,一个轻量级、语义化的 golang 编码解码、加密解密库
    dongle是一个轻量级、语义化、对开发者友好的Golang编码解码和加密解密库Dongle已被awesome-go收录,如果您觉得不错,请给个star吧github.com/golang-module/dong......
  • golang的New研究
    直接上代码:packagemainimport( "fmt" "reflect")funcmain(){ varn=33 varpn=&n varppn=&pn //new可以定义不同类型的地址,可以是int/int*/int......
  • 使用 gvm 来快速安装或者升级 golang 版本
    gvm是golang的版本管理工具,有点类似于python的pyenv。一、安装gvmbash<<(curl-s-S-Lhttps://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gv......
  • golang的defer使用一
    先来看例子:例子1:packagemainimport"fmt"funcrefertest()int{variintfmt.Printf("在没有调用defer之前。i的值为:%d,i的地址为:%p",i,&i)fmt.Println()d......