有没有一种简单的方法可以在Golang中将数据库行转换为JSON

时间:2016-09-25 08:52:13

标签: go

目前我所看到的是,将数据库行转换为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)
  }

这有什么包裹吗?或者我在这里缺少一些基础知识

4 个答案:

答案 0 :(得分:5)

我正在处理同样的问题,就我的调查而言,它似乎有别的方式

我见过的所有软件包使用的方法基本相同

您应该知道很少的事情,希望节省您的时间

  • database / sql package将所有数据转换为适当的类型
  • 如果您使用的是mysql驱动程序( go-sql-driver / mysql ),则需要添加 params到你的db字符串,它返回类型时间而不是字符串 (使用?parseTime = true,默认为false)

您可以使用社区编写的工具来减轻开销:

  • 围绕数据库/ sql的简约包装器sqlx,在内部使用与反射相似的方式。

  • 如果您需要更多功能,请尝试使用“orm”:gorpgorm

如果您有兴趣深入探究,请查看:

  • 在sqlx包中使用反射,sqlx.go第560行
  • 数据库/ sql包中的数据类型转换,convert.go第86行

答案 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)
}