RecordNotFound возвращает false, когда строк нет - PullRequest
0 голосов
/ 29 августа 2018

У меня проблема с этой библиотекой , потому что эта функция возвращает ложь, даже если заданный ввод отсутствует в базе данных, хотя на самом деле он должен возвращать истину.

type User struct {
    ID          uint      `gorm:"primary_key"`
    Username    string    `json:",omitempty"`
    Password    string    `json:",omitempty"`
    CreatedAt   time.Time `json:",omitempty"`
}

b, err := db.Con()
if err != nil {
    log.Panic(err)
}

defer db.Close()

// We want an empty struct
// Otherwise it will trigger the unique key constraint
user := []User{}

// Check if the username is taken
// BUX, MUST FIX: This always returns false for some reason
if db.Where(&User{Username: "MyUsername"}).Find(&user).RecordNotFound() == false {
    fmt.Println("Username found")
}

Почему он всегда возвращает false, даже если строка пуста?

1 Ответ

0 голосов
/ 29 августа 2018

Привет, Джеффри, добро пожаловать в раздел go Переполнения стека.

Следующий код должен работать так, как вы ожидаете:

// We want an empty struct
user := User{} // We expect to have one (or no) user returned.

// Check if the username is taken
// Notice the use of First() instead of Find()
if !db.Where("username = ?", "MyUsername").First(&user).RecordNotFound() {
    fmt.Println("Username found, here's the user:", user)
} else {
    fmt.Println("Username not found")
}

Поскольку mkopriva уже упомянул, ErrRecordNotFound не сработает при работе со слайсами.

Так как вам не нужны кусочки (ваше имя пользователя должно быть уникальным) мы можем:

  1. Ссылка не группа пользователей, а один пользователь User{} вместо []User{}.

  2. Используйте метод gorms First() вместо Find().

...