最近有这样的需求,需要将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
```
>但是在最后类型转换的部分,感觉会有潜在问题
>未完待续
有疑问加站长微信联系(非本文作者)