在GoLang中迭代MySQL记录并创建JSON

3

我正在尝试从我的 Go 应用程序中读取来自 MySQL 数据库的数据。

var queryStr string = "SELECT * FROM Customers"
rows, err := db.Query(queryStr)

defer rows.Close()
for rows.Next() {
    // do stuffs
}

查询语句正确且可用;现在我想将MySQL查询的每条记录轻松映射到我之前定义的Customer对象,如下所示:

type Customer struct {
    id              IntegerType     `json:"id"`
    name            string          `json:"name"`
    surname         string          `json:"surname"`
}

我该怎么做呢?

第二个问题:一旦我得到了一个Customer对象的数组,我如何轻松地将其放入一个名为"data"的特定键下的新JSON对象中呢?

感谢您的支持 :)

1个回答

11

将字段导出,以便在JSON上使用:

type Customer struct {
   ID      int         `json:"id"`
   Name    string      `json:"name"`
   Surname string      `json:"surname"`
}

声明一个值以进行 JSON 编组:

var v struct {
    Data []Customer `json:"data"`
}

查询特定字段:

var queryStr string = "SELECT id, name, surname FROM Customers"
rows, err := db.Query(queryStr)

循环遍历行,将其值加起来。

defer rows.Close()
for rows.Next() {
    // Scan one customer record
    var c Customer
    if err := rows.Scan(&c.ID, &c.Name, &c.Surnmae); err != nil {
        // handle error
    }
    v.Data = append(v.Data, c)
}
if rows.Err() != nil {
    // handle error
}

将该值编组为JSON

p, err := json.Marshal(v)
if err != nil {
    // handle error
}

p是一个包含 JSON 数据的 []byte 类型。


高质量答案 - Drew
谢谢你的回答,但有些地方我不太明白: 1)当你定义变量v结构时,在结构内部的Customer数组中我应该分配什么名称?我写了"Data",但出现了"未解决的引用'Data'"的错误 :( 2)当我写if rows.Err() != nil时,它显示"未解决的类型'nil'",我该如何修复这个问题?我需要导入其他内容吗? 3)我将一个变量定义为:var p[] byte,然后我写了p, errorsMarsh := json.Marshal(v),但它显示"未使用的变量p",但事实并非如此,我是不是漏掉了什么?提前感谢你的帮助。 - Roberto Milani
  1. 我修正了有关数据的拼写错误。
  2. nil 是一个预声明标识符。使用它不需要导入任何内容。
  3. 我的示例代码使用了短变量声明,你不需要声明 p
- Charlie Tumahai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接