我需要在开始我的Next()循环之前获得*sql.Rows
的长度以获取值。一种方法是通过循环Next()两次,获取计数,然后循环遍历新切片以将值拉出来创建一个行切片,但这似乎效率非常低,所以我希望有更好的方法做这个。
查看文档,我看不到我可以使用的Count函数或Length函数:https://golang.org/pkg/database/sql/#Rows
看看Go代码,我在结构中看不到任何可以帮助我的东西(虽然我可能会遗漏一些东西,所以会很欣赏第二双眼睛):https://github.com/golang/go/blob/master/src/database/sql/sql.go#L1714
当然有一些方法可以做到这一点,而不仅仅是循环Next()两次?
我意识到我也可以进行单独的计数查询,甚至在我的其他选择中包含计数(*),但我也宁愿避免这种情况。这是一个Go ORM项目,我不想让select语句过于复杂,我宁愿尽可能避免篡改他们的构建请求。
感谢。
答案 0 :(得分:2)
你基本上列出了你的选择。没有隐藏的功能可以为您提供行数。
请注意,某些特定于db的驱动程序可能支持此功能,但通用接口不支持此功能。
另请注意,如果您计划迭代行并无论如何都要读取它们,这意味着您可以忽略不计的开销。如果行计数非常大并且查询返回了很多数据并且您想避免为所有数据分配内存,那么请事先执行putIfAbsent()
查询,这样您就可以知道结果的数量(但是知道它可能会如果同时插入或更新记录,则更改下一个查询。