1 回答
TA贡献1851条经验 获得超4个赞
看起来您可以使用QueryRow,因为该查询预计仅返回一行。
QueryRow 执行预计最多返回一行的查询。QueryRow 总是返回一个非零值。错误被推迟到调用 Row 的 Scan 方法。
在这种情况下,如果没有行,则ErrNoRows发生,但会推迟到.Scan发生。
当 QueryRow 不返回行时,Scan 返回 ErrNoRows。在这种情况下,QueryRow 返回一个占位符 *Row 值,该值将此错误推迟到扫描。
所以你想做的是:
var id int
var secret string
var shortname string
err := db.QueryRow("SELECT ...").Scan(&id, &secret, &shortname)
switch {
case err == sql.ErrNoRows:
log.Printf("Not found.")
case err != nil:
log.Fatal(err)
default:
//do stuff
}
否则,由于您rows.Next无论如何都需要循环,您可以轻松设置一个标志:
defer rows.Close()
has_results := false
for rows.Next() {
has_results = true
//do stuff
}
if (!has_results) {
//error handling
}
- 1 回答
- 0 关注
- 214 浏览
添加回答
举报
