我如何检查我的 Db.Query 是否返回空行

Hai*_*i U 4 mysql postgresql go

以下是我从数据库获取多行的代码,它可以工作。


    defer db.Close()
    for rows.Next() {
    err = rows.Scan(&a)
    if err != nil {
        log(err)
    }
Run Code Online (Sandbox Code Playgroud)

如何检查行是否不包含行?

即使我尝试如下

if err == sql.ErrNoRows {
        fmt.Print(No rows)
    }  
Run Code Online (Sandbox Code Playgroud)

并在扫描时检查

 err = rows.Scan(&a)
 if err == sql.ErrNoRows {
        fmt.Print(No rows)
    }  
Run Code Online (Sandbox Code Playgroud)

我不明白哪一个给出 ErrNoRows *Rows 或 err 或 Scan

Bri*_*its 8

QueryRow返回 a *Row(不是 a *Rows),并且您无法迭代结果(因为它只期望返回一行)。这意味着rows.Scan您的示例代码将无法编译)。

如果您希望 SQL 查询返回单个结果(例如,您正在运行 count() 或使用 ID 进行选择),则使用 QueryRow;例如(从这里修改):

id := 43
var username string
err = stmt.QueryRow("SELECT username FROM users WHERE id = ?", id).Scan(&username)
switch {
case err == sql.ErrNoRows:
    log.Fatalf("no user with id %d", id)
case err != nil:
    log.Fatal(err)
default:
    log.Printf("username is %s\n", username)
}
Run Code Online (Sandbox Code Playgroud)

如果您期望多行,则使用Query()例如(从此处修改):

age := 27
rows, err := db.Query("SELECT name FROM users WHERE age=?", age)
if err != nil {
    log.Fatal(err)
}
defer rows.Close()
names := make([]string, 0)
for rows.Next() {
    var name string
    if err := rows.Scan(&name); err != nil {
        log.Fatal(err)
    }
    names = append(names, name)
}
// Check for errors from iterating over rows.
if err := rows.Err(); err != nil {
    log.Fatal(err)
}
// Check for no results
if len(names) == 0 {
    log.Fatal("No Results")
}
log.Printf("%s are %d years old", strings.Join(names, ", "), age)
Run Code Online (Sandbox Code Playgroud)

上面显示了一种检查是否没有结果的方法。如果您不将结果放入切片/映射中,那么您可以在循环中保留一个计数器或设置一个布尔值。请注意,如果没有结果,则不会返回错误(因为这是一个完全有效的结果),并且 SQL 包除了迭代结果之外,没有提供任何方法来检查结果的数量(如果您感兴趣的只是结果的数量)。然后运行结果select count(*)...)。