2016-09-30 35 views
1

我正在使用goLang lib/pq驅動程序並試圖從數據庫中獲取行。如何查找從db.Query返回的行數postgres

rows, err := db.Query("select id, name from mytable limit 5") 

我想有它檢查是否有結果行設置,如果else子句和我這樣做:

if(!rows.Next()){ 
    log.Printf("no rows returned") 
} else { 
    log.Printf("rows returned") 
} 

但這總是返回我1紀錄的水平低,我以爲是因爲它if子句跳過一條記錄,因爲只要我刪除if子句,我就可以正確地獲取所有記錄。如何知道select查詢返回的行數而不執行其他查詢?

+0

這將是一個問題,以循環行並將值附加到切片? – jcbwlkr

回答

2

當你用Rows對象的工作,沒有任何輔助方法給你的整體排在一個步數。

簡單,但速度慢的解決辦法是使用增量變量來存儲行的數量在所有的結果進行迭代:

// error handling omitted 
rows, _ := db.Query("SELECT * FROM table") 
defer rows.Close() 

counter := 0 
for rows.Next() { 
// you can even scan+store the result if you need them later 
counter++ 
} 

fmt.Println("we have", counter, "rows") 

否則,如果你的目標只是「計數」行量,使用更專用的查詢與QueryRow

// error handling omitted 
var counter int 

db.QueryRow("SELECT count(*) FROM table").Scan(&counter) 

fmt.Println("we have", counter, "rows") 
0

sql.Rows類型被設計爲包含多個結果,你需要調用rows.Scan每一次的結果,並呼籲rows.Next,看是否有下面的所有到目前爲止已處理的結果的下一個結果。

要從文件引用的例子爲sql.Rows類型:

rows, err := db.Query("SELECT ...") 
... 
defer rows.Close() 
for rows.Next() { 
    var id int 
    var name string 
    err = rows.Scan(&id, &name) 
    ... 
} 
err = rows.Err() // get any error encountered during iteration 
...