从PostGres DB获取结构

时间:2015-12-08 00:10:40

标签: database postgresql struct go

我在这里跟着一个帖子,想出了这个

var b Button

queryErr := connection.QueryRow("SELECT id_printer, name, has_children FROM button WHERE id_parent IS NULL;").Scan(&b.ID, &b.Name, &b.Children)
if queryErr != nil {
    response, err := json.MarshalIndent(b, "", "  ")
    fmt.Fprint(w, string(response))
    if err != nil {
        log.Println("Error on jsonmarshalindent Starter")
    }
} else {
    log.Println("Error on queryErr  starter")
    log.Println(queryErr)

    fmt.Fprint(w, "Error getting starter button")
}

它有两个问题:

  1. 打破b.Children
  2. 我不知道如何动态制作它。例如,查询返回3行,但它取决于公司的客户端,它可以是3或任何数字。
  3. 结构是

    type Starter struct {
        Buttons []Button `json:buttons`
    }
    
    type Button struct {
        ID       int    `json:id`
        Name     string `json:name`
        Children bool   `json:children`
    }
    

    有人可以为此解释一下吗?

1 个答案:

答案 0 :(得分:1)

对于bool,它取决于实际列的类型。如果它不是布尔值,则不会直接映射。

您可能需要先存储一个临时变量,然后翻译并分配到Button中的字段以匹配。

至于阅读所有行,这是一个改编自docs的例子。

使用Query而不是QueryRow来获取所有行。

rows, err := db.Query("SELECT id_printer, name, has_children FROM button WHERE id_parent IS NULL;")
if err != nil {
        log.Fatal(err)
}
defer rows.Close()
var buttons []Button
for rows.Next() {
        var b Button
        if err := rows.Scan(&b.ID, &b.Name, &b.Children); err != nil {
                log.Fatal(err)
        }
        buttons = append(buttons,b)
}
// At this point, you have all your rows in the "buttons" variable