zoukankan      html  css  js  c++  java
  • Golang开发实践:把数据库数据保存到map[string]interface{}中

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

    保存到map[string]interface{}

    看了一下Golang标准库database/sqlRows的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

  • 相关阅读:
    个人博客作业-软件案例分析1 博客园和CSDN
    第一次结对项目
    个人项目作业(1)
    个人博客作业(1)
    第一次个人作业
    面向对象第四单元总结和期末总结
    面向对象第三单元总结
    面向对象第二单元总结
    UML——BUAA_OO 第四单元总结 & 课程总结
    JML——BUAA_OO 第三单元总结
  • 原文地址:https://www.cnblogs.com/liujie-php/p/10434545.html
Copyright © 2011-2022 走看看