Как я могу проверить, возвращает ли мой Db.Query пустые строки - PullRequest
0 голосов
/ 07 февраля 2020

Ниже приведен мой код для получения нескольких строк из БД, и он работает.


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

Как проверить, что строки не содержат строк?

Даже я пытался, как показано ниже

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

и также проверяется при сканировании

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

Я не понимаю, какой из них дает ErrNoRows либо * Rows, либо err, либо Scan

1 Ответ

1 голос
/ 07 февраля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...