登录
首页 >  Golang >  Go问答

如何验证 Db.Query 返回结果为空

来源:stackoverflow

时间:2024-02-28 21:09:23 319浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《如何验证 Db.Query 返回结果为空》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

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

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


解决方案


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(*)...)。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>