【问题标题】:Why is Gorm not returning results with Rows()?为什么 Gorm 不使用 Rows() 返回结果?
【发布时间】:2021-02-27 23:58:59
【问题描述】:

我已经用 .Rows() 和 .Scan() 尝试过这个。我不明白为什么 .Rows 有这个日志

SELECT TOP(100) * from person[] 0

.Scan 有这个

SELECT TOP(100) * from person[] 100

扫描的结果将值正确地存储在结构中。 scanRows 的结果在结构中不存储任何内容。

这是我的代码 sn-p

if table.ResultsPerPage > 0{
    getDB().Raw("SELECT TOP(100) * from person").Scan(rowContainer) //dynamic struct
    rows, err := getDB().Raw("SELECT TOP(100) * from person").Rows()
    if err != nil {
        return err, nil
    }
    defer rows.Close()

    rowCount := 0
    for rowCount< table.ResultsPerPage {
        if(!rows.Next()){
            break
        }
        if err = rows.Err(); err != nil {
            return err, nil
        }

        err = getDB().ScanRows(rows, &rowContainer) // dynamic struct
        if err != nil {
            return err, nil
        }
        rowCount++
    }

【问题讨论】:

  • 我想使用行,因为我不想同时在内存中的所有内容。扫描工作正常并返回所有内容。行有点工作,它有 rows.Next() 返回 true。但它的内容只包含表头。数据在哪里?
  • 奇怪的是,我在进行扫描时不需要 &,但如果我将其从 scanRows 中删除,我会得到一个无法寻址的恐慌值

标签: go go-gorm


【解决方案1】:

Scan() 一次获取所有行可能会消耗大量内存。 Scan() 知道将获取多少行,因为它只是获取了所有行。 Scan() 需要一个切片来放入结构体。

Rows() 提供了一个迭代器,因此您可以一次获取一个迭代器,确保内存使用保持不变。 Rows() 不知道将获取多少行。 ScanRows() 应该被赋予一个结构,而不是一个切片。

如果您一次需要内存中的所有行,请使用Scan()。如果您一次只需要一个,请使用Rows().

【讨论】:

  • 我无法从 rows() 返回任何行。什么都没有,但扫描工作正常并将它们全部返回。我不想全部退回,一次只退回 1 个。
  • 更正,它返回带有 rows.Next() 的行,它返回 true。但是里面没有数据,看起来只有列名。
  • @coloradoman getDB().ScanRows(rows, &amp;rowContainer) 之后的行数据应该在rowContainer 中。但是,您将rowContainer 用于获取一行的ScanRows 和获取多行的ScanrowContainer 是什么?
  • 它是一个动态结构的切片,表示来自此选择的数据。我感觉 &rowContainer 不是我想做的。
  • 我想要做的只是将该结构转换为 csv。我正在使用 gocsv github.com/gocarina/gocsv。但它只接受一个切片作为制作 .csv 的参数
【解决方案2】:

如果您注意到 rowContainer 实际上是一个切片,因为在扫描中它能够将多行放入其中。我不得不使用 &rowContainer 以免引发段错误。这是执行此操作的错误方法。为了解决这个问题,我只是为 .rows() 使用了一个结构而不是一个结构切片

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2013-03-10
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多