【问题标题】:How to get count of sql.Rows without using Next()?如何在不使用 Next() 的情况下获取 sql.Rows 的计数?
【发布时间】:2016-06-04 19:06:45
【问题描述】:

我需要得到*sql.Rows 的长度之前我开始我的Next() 循环来获取值。一种方法是通过循环 Next() 两次来创建行切片,获取计数,然后循环遍历该新切片以提取值,但这似乎效率很低,所以我希望有更好的方法做这个。

查看文档,我没有看到我可以使用的 Count 函数或 Length 函数:https://golang.org/pkg/database/sql/#Rows

查看 Go 代码,我在 struct 中看不到任何可以帮助我的东西(尽管我可能遗漏了一些东西,所以希望能在这里看到第二双眼睛):https://github.com/golang/go/blob/master/src/database/sql/sql.go#L1714

肯定有比只循环两次 Next() 更好的方法吗?

我意识到我也可以做一个单独的计数查询,甚至在我的另一个选择中包含一个 count(*),但我也宁愿避免这种情况。这是一个 Go ORM 项目,我不想让 select 语句过于复杂,我宁愿尽可能避免篡改他们构建的请求。

谢谢。

【问题讨论】:

  • 如何循环 r.Next() 两次()?第二次是空的。

标签: sql database go


【解决方案1】:

您基本上列出了您的选择。没有隐藏功能可以为您提供行数。

请注意,某些特定于 db 的驱动程序可能支持此功能,但通用接口不支持。

另请注意,如果您打算遍历行并无论如何都读取它们,这意味着您不必担心的开销可以忽略不计。如果行数非常大并且查询返回许多数据并且您希望避免为所有数据分配内存,请事先执行SELECT COUNT(*) 查询,以便您知道结果的数量(但知道它可能会在下一个查询是否同时插入或更新记录)。

【讨论】:

  • 好的,没问题,谢谢 icza,你总是那么乐于助人 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2014-07-13
相关资源
最近更新 更多