给出以下功能:
func (me *OrderService) GetOrders(orderTx *sql.Tx, orderId int) (orders *sql.Rows) {
orders, err := ecommTx.Query("SELECT * FROM orders WHERE id=?", orderId)
if err != nil {
log.Fatal(err)
}
log.Printf("Successfully queried and receive %d orders", orders.count)
return orders
}
有没有简单的方法来计算结果?我想保持这个数据库引擎的激动,但FWIW ....我正在使用Matt N's sqlite3 driver进行集成测试,但计划在prod中使用不同的数据库。
答案 0 :(得分:3)
没有可移植的方法来了解语句提前返回的行数,这意味着不会遍历返回的游标并进行计数。
有两种典型的解决方案:
运行单独的COUNT(*)
查询。此方法的问题在于它非常活泼(可以在两个查询之间修改结果集,至少在某些事务中隔离模式),所以它实际上只对像查询器这样的东西很有用,在那里你只返回部分结果集的查询,并想知道有多少其他行。
遍历光标并计算。在Go中,这意味着调用.Next()
,然后.Scan
将结果调入Order
结构。< / p>
答案 1 :(得分:2)
sql.Query()
返回*Rows
。 Rows
是一个读者,而不是一个集合,因此count()
或len()
等来电不相关。您必须通读Rows
才能知道您有多少条目:
count := 0
for orders.Next() {
count++
}
log.Printf("Successfully queried and receive %d orders", count)
这样做不会增加任何额外开销。其他语言,例如C#或Delphi,可能会返回一个具有count
属性的集合,只是为您阅读并将结果打包到一个集合中以方便您使用。