目前我所看到的是,将数据库行转换为JSON或[]map[string]interface{}
并不简单。我必须创建两个切片,然后遍历列并每次创建密钥。
......一些代码
tableData := make([]map[string]interface{}, 0)
values := make([]interface{}, count)
valuePtrs := make([]interface{}, count)
for rows.Next() {
for i := 0; i < count; i++ {
valuePtrs[i] = &values[i]
}
rows.Scan(valuePtrs...)
entry := make(map[string]interface{})
for i, col := range columns {
var v interface{}
val := values[i]
b, ok := val.([]byte)
if ok {
v = string(b)
} else {
v = val
}
entry[col] = v
}
tableData = append(tableData, entry)
}
这有什么包裹吗?或者我在这里缺少一些基础知识
答案 0 :(得分:5)
我正在处理同样的问题,就我的调查而言,它似乎有别的方式。
我见过的所有软件包使用的方法基本相同
您应该知道很少的事情,希望节省您的时间:
您可以使用社区编写的工具来减轻开销:
如果您有兴趣深入探究,请查看:
答案 1 :(得分:1)
如果您知道正在阅读的数据类型,那么您可以在不使用通用接口的情况下读入数据类型。
否则,由于JSON本身的性质,无论使用何种语言都没有解决方案。
JSON没有复合数据结构的描述。换句话说,JSON是一个通用的键值结构。当解析器遇到应该是特定结构的东西时,在JSON本身中没有该结构的标识。例如,如果您有一个结构User,则解析器不会知道一组键值对如何映射到您的结构User。
类型识别的问题通常通过文档模式(在XML世界中的X.k.XSD)或通过传递的预期数据类型明确解决。
答案 2 :(得分:1)
您可以做的一件事是创建一个为数据建模的结构。
**注意:我正在使用MS SQLServer
因此,假设您想要获得用户
type User struct {
ID int `json:"id,omitempty"`
UserName string `json:"user_name,omitempty"`
...
}
然后你可以这样做
func GetUser(w http.ResponseWriter, req *http.Request) {
var r Role
params := mux.Vars(req)
db, err := sql.Open("mssql", "server=ServerName")
if err != nil {
log.Fatal(err)
}
err1 := db.QueryRow("select Id, UserName from [Your Datavse].dbo.Users where Id = ?", params["id"]).Scan(&r.ID, &r.Name)
if err1 != nil {
log.Fatal(err1)
}
json.NewEncoder(w).Encode(&r)
if err != nil {
log.Fatal(err)
}
}
以下是我使用的导入
import (
"database/sql"
"net/http"
"log"
"encoding/json"
_ "github.com/denisenkom/go-mssqldb"
"github.com/gorilla/mux"
)
这允许我从数据库中获取数据并将其转换为JSON。
代码需要一段时间,但效果确实很好。
答案 3 :(得分:0)
不在Go发布本身,但有精彩的jmoiron/sqlx:
import "github.com/jmoiron/sqlx"
tableData := make([]map[string]interface{}, 0)
for rows.Next() {
entry := make(map[string]interface{})
err := rows.MapScan(entry)
if err != nil {
log.Fatal("SQL error: " + err.Error())
}
tableData = append(tableData, entry)
}