以下是我从 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
最佳答案
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)
上面显示了一种检查是否没有结果的方法。如果您没有将结果放入 slice/ map 中,那么您可以在循环中保留一个计数器或设置一个 bool 值。请注意,如果没有结果,则不会返回任何错误(因为这是一个完全有效的结果),并且 SQL 包除了迭代它们之外没有提供检查结果数量的方法(如果您感兴趣的只是结果然后运行
select count(*)...
)。
关于mysql - 我如何检查我的 Db.Query 是否返回空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60106885/