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