2014-02-27 33 views
0

鉴于以下功能:如何获取使用数据库/ sql时返回的行数?

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 
} 

有没有简单的方法来.Count之间的结果?我想保持这个数据库引擎激动人心,但FWIW ....我使用Matt N's sqlite3 driver进行集成测试,但计划在产品中使用不同的数据库。

+0

SELECT count(*)FROM orders WHERE id = .... – esdebon

回答

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属性的集合,只是为您阅读并将结果打包到集合中,以方便您使用。

3

没有可移植的方式来知道语句预先返回的行数,这意味着无需迭代返回的游标和计数。

达到这一目的有两个典型的解决方案:

  • 运行单独的COUNT(*)查询。这种方法的问题在于它非常活跃(结果集可以在两个查询之间进行修改,至少在某些事务隔离模式下),所以它只对诸如寻呼机这样的事情有用部分结果集,并且想要知道有多少个其他行。

  • 遍历游标和计数。在Go中,意思是调用.Next(),然后.Scan将结果写入您的Order结构中。

相关问题