golang将mysql查询结果转换成json - 续集1

feloxx · · 1141 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

最近有这样的需求,需要将mysql里的数据发送至某些接口. 接口的通用数据格式,一般都是用json方式. 最开始的时候,是苦逼的先新建个结构体然后去mysql里查出来,再把结果赋值到结构体里,最后再讲结构体转换成json去发送. (发现太啰嗦了) 于是找了找,有不有一步到位的办法; 结果发现是可以直接将mysql的查询结果转换成json格式的. 首先感谢这几位 https://studygolang.com/articles/10512 https://stackoverflow.com/questions/19991541/dumping-mysql-tables-to-json-with-golang 这里面的思路给了我启发 (但是代码里面有个小小的不足,就是浮点型的类型不能识别,会默认转换成字符型) 于是一不做二不休,就有了如下的代码: (基本上就是参考了链接里面的代码,稍作改动,添加了类型的识别) ```go func getJSON2(sqlString string) ([]map[string]interface{}, error) { db, err := sql.Open("mysql", "root:root@tcp(localhost:3306)/testdb") stmt, err := db.Prepare(sqlString) if err != nil { return nil, err } defer stmt.Close() rows, err := stmt.Query() if err != nil { return nil, err } defer rows.Close() columns, err := rows.Columns() colTypes, err := rows.ColumnTypes() if err != nil { return nil, err } tableData := make([]map[string]interface{}, 0) count := len(columns) values := make([]interface{}, count) scanArgs := make([]interface{}, count) //构建一个 下标 字段名 字段类型的 listmap valuesAndType := make([]map[string]string, 0) for _, value := range colTypes { valuesAndType = append(valuesAndType, map[string]string{value.Name(): value.DatabaseTypeName()}) } for i := range values { scanArgs[i] = &values[i] } for rows.Next() { err := rows.Scan(scanArgs...) if err != nil { return nil, err } entry := make(map[string]interface{}) //根据准备好的 字段和类型的list map 去遍历字段,进行类型转换 for i, m := range valuesAndType { b := "" if temp, ok := values[i].([]byte); ok { b = string(temp) } else { b = strconv.FormatInt(values[i].(int64),10) } for mKey, mValue := range m { switch mValue { case "VARCHAR": entry[mKey] = b case "DECIMAL": entry[mKey], _ = strconv.ParseFloat(b, 64) case "BIGINT": entry[mKey], _ = strconv.Atoi(b) case "DATETIME": entry[mKey] = b case "TIMESTAMP": entry[mKey], _ = strconv.Atoi(b) case "BOOLEAN": entry[mKey], _ = strconv.ParseBool(b) } } } tableData = append(tableData, entry) } jsonData, err := json.Marshal(tableData) if err != nil { return nil, err } return string(jsonData), nil ``` >但是在最后类型转换的部分,感觉会有潜在问题 >未完待续

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1141 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传