2014-10-30 3 views
0

Подпись: func (db *DB) Query(query string, args ...interface{}) (*Rows, error).Go func (* DB) Запрос возвращается, если такой строки не существует

Что Go func (*DB) Query возврат, если запрос и вызов:

rows, err := db.Query("SELECT username FROM userstable WHERE username=$1", registerInstance.Username) 

когда нет такой строки в таблице userstable.

Он возвращает не-нуль error или возвращает значение пустой строки как Result, а non-nil error возвращается только при возникновении ошибки?

+1

это может быть легко решена, пробуя запроса во время отладки. Он должен возвращать набор строк, будучи пустым. – Momer

+0

Спасибо, ты прав. –

+0

Но это правильный вопрос. Это указывает на разницу в ошибках и пустые строки. На самом деле это было обнаружено ответом @dave. Ответ, содержащий подсказки в документах, не аннулирует вопрос, но ответ ответчика не включен в ссылку документации, которую он предоставил. –

ответ

1

В этом случае вы обязательно захотите использовать QueryRow вместо Query (при условии, что вы получите только одного пользователя с тем же именем пользователя).

http://go-database-sql.org/retrieving.html От

Go определяет особую ошибку постоянную, называемую sql.ErrNoRows, который возвращается из QueryRow(), когда результат пуст. В большинстве случаев это необходимо рассматривать как особый случай. Пустой результат часто не считается ошибкой по коду приложения, и если вы не проверяете, является ли ошибка этой специальной константой, вы вызовете ошибки кода приложения, которых вы не ожидали.

При использовании Query, вы будете зацикливание над результатами что-то вроде:

rows, err := db.Query("SELECT username FROM userstable WHERE username=$1", registerInstance.Username) 
if err != nil { 
    log.Fatal(err) 
} 
defer rows.Close() 
var users []User 
for rows.Next() { 
    user = User{} 
    err := rows.Scan(&user.Username) 
    if err != nil { 
     log.Fatal(err) 
    } 
    users = append(users, user) 
} 
rows.Close() 
if (len(users) == 0) { 
    //handle this case 
} 
+0

Я попытался отредактировать строку 'users: = append (users, user)' to 'users = append (users, user)'. Но изменение должно иметь мин. 6 символов. Поэтому я удалил строку, сохраненную и отредактированную, но в последний раз она не смогла сохранить изменения. Ной, похоже, хорошо. Изменения вступили в силу. –

+0

Нет проблем, хороший улов, отредактированный – dave