【问题标题】:How to write table data into a nested struct in Go如何在 Go 中将表数据写入嵌套结构
【发布时间】:2021-12-31 12:37:13
【问题描述】:

总结

我正在尝试将多个 postgres 表中的数据写入嵌套的 Go 结构,以便在我的 Web 应用程序中返回对 GET 请求的单个 json 响应。

问题

  1. 从 Go 最佳实践的角度来看,我声明嵌套结构的方式是否合理,或者是否有理由我应该避免使用这种方法并以另一种方式使用?
  2. 我在 第 3 步 中做错了什么以阻止我的代码工作? (我担心答案是“一切”)

到目前为止我所得到的

  1. 我已经声明了我的结构体
type MainObject struct {

    SubObjects []struct {
        SpecificDetail string `json:"specific-detail"`
                           }  `json:"sub-object"`

    ...(other []structs)...
}
  1. 我已从表中检索到行
func getMainObjectHandler(w http.ResponseWriter, r *http.Request) {
    
    ...(database connnection)...
    
    MainObjectID := r.URL.Query().Get("moid")
    if MainObjectID != "null" {
        NewMainObject := MainObject{}
        SubObjectDetail_rows, err := db.Query("SELECT specific_detail from the_table WHERE moid= '" + MainObjectID + "'")
        if err != nil {
            log.Fatalf("could not execute query: %v", err)
        }
        
        ...(other db.Query rows)...
  1. 我已尝试(但失败)将行数据构建到结构中。
        for SubObjectDetail_rows.Next() {
            SpecificDetail := NewMainObject.SubObject.SpecificDetail{}
            SubObjectDetail_rows.Scan(&SpecificDetail)
            SubObject = append(SubObject, SpecificDetail)
        }
        NewMainObject = append(MainObject, SubObject)
        defer persona_rows.Close()
  1. 最后,我已经设置了 Marshal 并编写了。
        NMOListBytes, err := json.Marshal(NewMainObject)
        if err != nil {
            fmt.Println(fmt.Errorf("Error: %v", err))
            w.WriteHeader(http.StatusInternalServerError)
            return
        }
        w.Write(NMOListBytes)

【问题讨论】:

    标签: go struct slice nested-json


    【解决方案1】:

    首先,请在创建 SQL 查询时使用占位符以避免注入:

    // db.Query("SELECT specific_detail from the_table WHERE moid= '" + MainObjectID + "'")  // not this
    db.Query("SELECT specific_detail from the_table WHERE moid=?", MainObjectID)
    

    除非您使用像GORM 这样的框架,否则您不能将Scan() 放入单个结构值中。 来自the docs

    Scan 将当前行中的列复制到指向的值中 按目的地dest 中值的个数必须与数字相同 行中的列数。

    看起来您正在从数据库查询中提取 JSON,因为您只查询一列,所以您可能想要:

    var bs []byte // get raw JSON bytes
    
    err = SubObjectDetail_rows.Scan(&bs) 
    if err != nil { /* always check errors */ }
    

    然后将它们解组到您的结构中:

    err = json.Unmarshal(bs, &SpecificDetail)
    if err != nil { /* ... */ }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多