加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang开发实践:把数据库数据保存到map[string]interface{}中

发布时间:2020-12-16 09:29:55 所属栏目:大数据 来源:网络整理
导读:Golang读取数据库很简单,可以使用ORM也可以直接使用SQL语句。然而要处理的数据库表有几十个字段,光是定义一个四十多个字段的数据模型就让人感觉痛苦,况且并不是所有字段都要参与运算。于是就决定使用SQL语句来处理。保存到map[string]interface{},这样也

Golang读取数据库很简单,可以使用ORM也可以直接使用SQL语句。然而要处理的数据库表有几十个字段,光是定义一个四十多个字段的数据模型就让人感觉痛苦,况且并不是所有字段都要参与运算。于是就决定使用SQL语句来处理。保存到map[string]interface{},这样也方便实现导出字段可配置的需求。

保存到map[string]interface{}

看了一下Golang标准库database/sql中Rows的API文档,并没有提供获取所有字段的API接口,文档提供的实例代码调用了Scan函数并传入相关指针获取数据.

rows,err := db.Query("SELECT ...")
...
defer rows.Close()
for rows.Next() {
    var id int
    var name string
    err = rows.Scan(&id,&name)
    ...
}
err = rows.Err() 

这样的处理方式明显无法完成需求,于是就想到了Golang强大的interface{},可以将相应长度的[]interface{}作为不定长参数传入Scan函数:

type Record interface{}

func (tf *DataIterator) parseRows(rows *sql.Rows,cSize int) (error) {
    columns,err := rows.Columns()
    if err != nil {
        return err
    }
    size := len(columns)
    pts := make([]interface{},size)
    container := make([]interface{},size)
    tf.cache = make([]Record,cSize)
    cursor := 0
    for i := range pts {
        pts[i] = &container[i]
    }
    for rows.Next() {
        err = rows.Scan(pts...)
        if err != nil {
            return err
        }
        var r Record = make(map[string]interface{},size)
        for i,column := range columns {
            r[column] = container[i]
        }
        tf.cache[cursor] = r
        cursor++
    }
    return nil
}

  

首先通过Rows.Columns获取数据库返回的字段
声明相同长度的[]interface{}用以保存一行数据
声明相同长度的[]interface{}作为容器
将pts中元素的指针存入容器
调用Rows.Scan()并将container作为不定长参数传入
遍历Rows中的每一行数据即可保存数据库数据到map[string]interface{}

关于字符串

在实际操作中发现用这种操作方法数据库中的字符串(CHARVARCHAR等)类型会被作为[]uint8。遍历结果转换为string即可:

func formatRecord(r Record) {
    for k,v := range r {
        switch v.(type) {
        case []uint8:
            arr := v.([]uint8)
            r[k] = uiToS(arr)
        case nil:
            r[k] = ""
        }
    }
}

  

--------------------- 作者:粗鄙之语 来源:CSDN 原文:https://blog.csdn.net/iyeahme/article/details/74932619

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读