有没有更好的方法来编组SQL行?

时间:2015-01-18 19:49:58

标签: mysql json go

我有以下结构:

type MyTable struct{
  DBColA []byte `db:"cola" json:"-"`
  ColA string `json:"cola"`
  DBColB []byte `db:"colb" json:"-"`
  ColB string `json:"colb"`
}

我映射到[] byte [以更好地处理我的sql中的空值] [1]

当我抓住行时,我需要将其输出为json。为此,我将[] byte转换为string:

var rows []*MyTable
if _, err := Session.Select(&rows, sql, args...); err != nil {
    log.Println(err)
}
for _, row := range rows{
   row.ColA = string(row.DBColA)
   row.ColB = string(row.DBColB)
}
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(rows); err != nil {
  http.Error(w, err.Error(), http.StatusInternalServerError)
}

在我的结构中使用DBColA和ColA然后将DBColA转换为字符串似乎非常低效....我有很多列。还有更好的方法吗?

  [1]: https://github.com/go-sql-driver/mysql/wiki/Examples

1 个答案:

答案 0 :(得分:5)

您是否在gosqljson中尝试了https://github.com/elgs/gosqljson

参见示例:

```golang

package main

import (
    "database/sql"
    "fmt"
    "github.com/elgs/gosqljson"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    ds := "username:password@tcp(host:3306)/db"
    db, err := sql.Open("mysql", ds)
    defer db.Close()

    if err != nil {
        fmt.Println("sql.Open:", err)
    }

    theCase := "lower" // "lower" default, "upper", camel

    a, _ := gosqljson.QueryDbToArrayJson(db, theCase, "SELECT ID,NAME FROM t LIMIT ?,?", 0, 3)
    fmt.Println(a)
    // [["id","name"],["0","Alicia"],["1","Brian"],["2","Chloe"]]

    m, _ := gosqljson.QueryDbToMapJson(db, theCase, "SELECT ID,NAME FROM t LIMIT ?,?", 0, 3)
    fmt.Println(m)
    // [{"id":"0","name":"Alicia"},{"id":"1","name":"Brian"},{"id":"2","name":"Chloe"}]

}

````