如何查找从db.Query postgres返回的行数

时间:2016-09-30 04:36:33

标签: postgresql go

我正在使用goLang lib / pq驱动程序并尝试从数据库中获取行。

public String comboboxUse() throws DAOException{

我想要一个if else子句来检查结果集中是否有行,我这样做了:

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

但这总是让我减少1记录而且我假设它因为if(!rows.Next()){ log.Printf("no rows returned") } else { log.Printf("rows returned") } 子句而跳过一条记录,因为只要删除if子句,我就能正确获取所有记录。如何在不执行其他查询的情况下知道从select查询返回的行数?

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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
...