在Pgx中运行SELECT * FROM table查询?

4

我正在使用 PostgreSQL,尝试在 Pgx 中运行 SELECT * FROM 查询。但是迭代不下来,只返回表中的最后一个键。同时,我还在尝试将其作为 JSON 在 echo HTTP 服务器库中使用。

main.go 函数(从我的数据库连接文件导入 connection.Conn)

func getLanguages(c echo.Context) (err error) {

    Conn := connection.Conn
    type Row struct {
        Id       int
        Language string
        Name     string
    }

    rowArray := Row{}

    rows, err := Conn.Query(context.Background(), "SELECT * FROM languages")

    defer rows.Close()

    // rowsCount := 0

    for rows.Next() {
        err := rows.Scan(&rowArray.Id, &rowArray.Language, &rowArray.Name)
        if err != nil {
            log.Fatal(err)
        }
    }

    fmt.Println(rowArray)

    return c.JSON(http.StatusOK, rowArray)

} 

期望的输出结果

 id |  language  |        name         
----+------------+---------------------
  1 | none       | Plaintext
  2 | go         | Golang
  3 | python     | Python
  4 | js         | JavaScript
  5 | jsx        | React JSX
  6 | ts         | TypeScript
  7 | tsx        | React TSX
  8 | tsconfig   | TSConfig
  9 | rb         | Ruby
 10 | sql        | SQL
 11 | sol        | Solidity (Ethereum)
 12 | html       | HTML
 13 | css        | CSS
 14 | csharp     | C#
 15 | haskell    | Haskell
 16 | rust       | Rust
 17 | scala      | Scala
 18 | svg        | SVG
 19 | graphql    | GraphQL
 20 | php        | PHP
 21 | powershell | PowerShell
 22 | yaml       | YAML
 23 | json       | JSON

实际输出

{"Id":23,"Language":"json","Name":"JSON"} 

需要帮忙吗?

1个回答

13

rowArray := Row{}创建了一个Row的单个实例。然后您循环遍历结果并将它们存储在同一变量中。因此,每次迭代都会覆盖之前检索到的内容。如果有多个结果,则使用切片;类似以下未经测试的代码:

rows, err := Conn.Query(context.Background(), "SELECT * FROM languages")
if err != nil {
    log.Fatal(err)
}
defer rows.Close()

var rowSlice []Row
for rows.Next() {
    var r Row
    err := rows.Scan(&r.Id, &r.Language, &r.Name)
    if err != nil {
        log.Fatal(err)
    }
   rowSlice = append(rowSlice, r)
}
if err := rows.Err(); err != nil {
    log.Fatal(err)
}

fmt.Println(rowSlice)

非常感谢!我是Go的初学者,对很多东西一无所知,所以感谢您教我如何使用slice! - Sam Morris
1
如果你之前没接触过切片,我建议先完成 A Tour of Go。这个教程能够很好地讲解基础知识。 - Brits

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