【问题标题】:How can i Check if my Db.Query returns null rows我如何检查我的 Db.Query 是否返回空行
【发布时间】:2020-05-23 04:52:01
【问题描述】:

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


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

如何检查行是否包含 No row?

即使我像下面这样尝试过

if err == sql.ErrNoRows {
        fmt.Print(No rows)
    }  

并且还在扫描时检查

 err = rows.Scan(&a)
 if err == sql.ErrNoRows {
        fmt.Print(No rows)
    }  

我不明白哪个给出 ErrNoRows 要么 *Rows 要么 err 要么 Scan

【问题讨论】:

    标签: mysql postgresql go


    【解决方案1】:

    QueryRow 返回一个*Row(不是*Rows)并且您不能遍历结果(因为它只需要返回一行)。这意味着您的示例代码中的rows.Scan 将是not compile)。

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

    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)
    }
    

    如果您期望多行,请使用 Query() 例如(修改自 here):

    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)
    

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

    【讨论】:

    • 我很抱歉它的查询不是 Queryrow 顺便说一下我不需要计数我想知道数据库是否包含行如果数据库中没有行那么我将返回之前而不是检查 row.next()
    • 不用担心 - 希望以上内容能回答您的问题? (我试图为两种检索结果的方式提供答案)
    • so if len(names) == 0 { log.Fatal("No Results") } 通过查找 len 是了解我们是否有行中数据的唯一方法
    • 很抱歉错过了您评论的后半部分。我添加了一些额外的信息;基本上你需要尝试遍历结果(即调用Next)。 SQL 包不提供任何其他选项(请参阅this question 了解更多信息)
    • "找到 len 是唯一的方法" - 不是唯一的方法,但我认为这通常是最简单的方法。您还可以在 for rows.Next() { 循环中将布尔值设置为 true 或增加计数(但如果使用标准 SQL 包,则无法避免调用 rows.Next)..
    猜你喜欢
    • 2017-02-08
    • 2020-09-09
    • 2022-11-03
    • 2014-05-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2011-08-22
    • 2020-11-13
    相关资源
    最近更新 更多