如何获取使用database / sql时返回的行数?

时间:2014-02-27 15:54:43

标签: sql go

给出以下功能:

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中使用不同的数据库。

2 个答案:

答案 0 :(得分:3)

没有可移植的方法来了解语句提前返回的行数,这意味着不会遍历返回的游标并进行计数。

有两种典型的解决方案:

  • 运行单独的COUNT(*)查询。此方法的问题在于它非常活泼(可以在两个查询之间修改结果集,至少在某些事务中隔离模式),所以它实际上只对像查询器这样的东西很有用,在那里你只返回部分结果集的查询,并想知道有多少其他行。

  • 遍历光标并计算。在Go中,这意味着调用.Next(),然后.Scan将结果调入Order结构。< / p>

答案 1 :(得分:2)

sql.Query()返回*RowsRows是一个读者,而不是一个集合,因此count()len()等来电不相关。您必须通读Rows才能知道您有多少条目:

count := 0
for orders.Next() {
    count++
}

log.Printf("Successfully queried and receive %d orders", count)

这样做不会增加任何额外开销。其他语言,例如C#或Delphi,可能会返回一个具有count属性的集合,只是为您阅读并将结果打包到一个集合中以方便您使用。