2014-02-27 54 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結構中。

相關問題