2016-09-30 13 views
1

私はgoLang lib/pq driverを使用しており、データベースから行を取得しようとしています。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句は1つのレコードをスキップします。どのようにして、別のクエリを実行せずにselectクエリから返された行の数を知ることができますか?

+0

行をループして値をスライスに追加するのは問題になりますか? – jcbwlkr

答えて

2

。あなたの目標は唯一の「カウント」に行の量であれば、そうでない場合

// 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オブジェクトを使用する場合、1つのステップでカウントあなたの総行を与える任意のヘルパーメソッドがない

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 
... 
関連する問題