栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

golang sqlx rows.Next() scan扫描列表和一行

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

golang sqlx rows.Next() scan扫描列表和一行

最近在用clickhouse,对于sql包,我用github.com/jmoiron/sqlx包替代了database/sql,但是查询时只能返回sqlx.Rows迭代对象要自己去Next(),获取一行时也用的是sqlx.Row。

所以想写个函数自动把rows转换成struct列表或map列表,查询一行也类似。不需要每次都要自己Next()。

现在分享下来。

1、扫描多行结果

(1)新建一个rows处理类

package clickhouses

import (
	"github.com/jmoiron/sqlx"
	"reflect"
)

type ClickhouseRows struct {
}

//Scan 扫描结果
func (r *ClickhouseRows) Scan(rows *sqlx.Rows, dest interface{}) error {
    var err error 

	arr := reflect.ValueOf(dest).Elem()
	valueType := reflect.TypeOf(dest).Elem().Elem()
	v := reflect.New(valueType)

	switch v.Interface().(type) {
	//Map格式
	case *map[string]interface{}:
		for rows.Next() {
			v := reflect.MakeMap(valueType)
            err = rows.MapScan(v.Interface().(map[string]interface{}))
			if err == nil {
				arr.Set(reflect.Append(arr, v))
			}
		}
	//结构体类型
	default:
		for rows.Next() {
			v := reflect.New(valueType)
            err = rows.StructScan(v.Interface())
			if err == nil {
				arr.Set(reflect.Append(arr, v.Elem()))
			}
		}
	}

    return err
}

(2)应用实例:

//连接数据库
db, err := sqlx.Open("clickhouse", "tcp://127.0.0.1:9000?debug=true")

if err != nil {
   panic(err)
}

//查询
rows, err := db.Queryx("SELECt * FROM users WHERe status = ?", 1)

if err != nil {
   panic(err)
}

//第1种、查询结果为结构体
type UserModel struct {
	Id int `db:"id"`
    Username string `db:"username"`
}

var structData []UserModel
new(ClickhouseRows).Scan(rows, &structData)

//第2种、查询结果为map结构
var mapData []map[string]interface{}
new(ClickhouseRows).Scan(rows, &mapData)

2、扫描一行结果

先新建sqlx.Row的处理类

注:请注意我这里的ClickhouseRow没有s结尾。

package clickhouses

import (
	"github.com/jmoiron/sqlx"
	"reflect"
)

type ClickhouseRow struct {
}

func (r *ClickhouseRow) Scan(row *sqlx.Row, dest interface{}) error {
    var err error

	valueType := reflect.TypeOf(dest).Elem()
	v := reflect.New(valueType)

	switch v.Interface().(type) {
	//Map格式
	case *map[string]interface{}:
		v := dest.(*map[string]interface{})
		err = row.MapScan(*v)
	//结构体类型
	default:
		err = row.StructScan(dest)
	}
   
    return err
}
//查询一行
row := db.QueryRowx("SELECt * FROM users WHERe status = ?", 1)

//第1种、查询结果为结构体
type UserModel struct {
	Id int `db:"id"`
    Username string `db:"username"`
}

var structRow UserModel
new(ClickhouseRow).Scan(row, &structRow)

//第2种、查询结果为map结构
mapRow := map[string]interface{}{}
new(ClickhouseRow).Scan(row, &mapRow)

关注PHP的特色框架 :Ocara框架

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/909529.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号