【问题标题】:Scan row into slice将行扫描成切片
【发布时间】:2020-06-07 16:46:39
【问题描述】:

我想像这样将 sql.Row 扫描成一个切片:

func printRows(rows *sql.Rows){
    defer rows.Close()

    for rows.Next() {
        var row = []interface{}{}
        err := rows.Scan(row...)
        if err != nil {
            log.Fatal(err)
        }
        r, err := json.Marshal(row)
        if err != nil {
            log.Fatal(err)
        }
        log.Println("row:", r);
    }
}

但我收到此错误:

2020/02/23 20:05:14 原始查询:SELECT * FROM user_table LIMIT 500 2020/02/23 20:05:14 sql:扫描中预期有 6 个目标参数,而不是 0

有人知道如何在不使用切片的情况下使其通用吗?

【问题讨论】:

  • 为什么要避免使用切片?您可以检查返回了多少列 (len(rows.Columns())),然后检查它来构建您的切片。 This post 有更多信息。
  • 如果这么简单,您可以在这里添加答案吗?谢谢
  • 1234、...的可能重复项

标签: sql go slice


【解决方案1】:

你可以这样做:

cols, err := rows.Columns() // Remember to check err afterwards
vals := make([]interface{}, len(cols))
for i, _ := range cols {
    vals[i] = new(string)
}

for rows.Next() {
    err = rows.Scan(vals...)
}

在互联网上他们说你可以使用:

    vals[i] = new(sql.RawBytes)

而不是

    vals[i] = new(string)

但我认为(字符串)很好,idk

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多