QueryRow возвращает *Row
(не *Rows
), и вы не можете перебрать результаты (потому что он ожидает только одну строку назад). Это означает, что rows.Scan
в вашем примере кода не скомпилируется ).
Если вы ожидаете, что ваш запрос SQL вернет один результат (например, вы запускаете count () или выбираете с использованием идентификатора), тогда используйте 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)
}
Если вы ожидаете несколько строк, используйте, например, 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)
Выше показан один из способов проверки отсутствия результатов. Если вы не помещаете результаты в срез / карту, вы можете сохранить счетчик или установить логическое значение в пределах l oop. Обратите внимание, что ошибка не будет возвращена, если нет результатов (потому что это совершенно верный результат), а пакет SQL не позволяет проверить количество результатов, кроме как перебирать их (если все, что вас интересует, это количество результатов затем запустить select count(*)...
).