Является ли моя функция поиска в соответствии с лучшими практиками - PullRequest
0 голосов
/ 05 ноября 2018

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

func (dbs *DbService) GetUserLocationId(locationId int) (User, error) {
    var model User
    if dbs.deps.db.Where("location_id = ?", locationId).Find(&model).RecordNotFound() {
        return model, errors.New("User not found")
    }
    return model, nil
}

Таким образом, обычным вариантом использования в веб-приложении является поиск модели, если она не существует, я вставлю новую запись.

используя вышеизложенное, я сделаю:

user, err := GetUserLocationById(123)
if err != nil {
  err := InsertNewUser(user)
}

Теперь, с чем я борюсь, так это с этим. Если ошибок не ноль, то я должен вставить нового пользователя. Но что, если ошибка в том, что мой запрос внутри функции GetUserLocationById имеет неправильное имя столбца? Я не хочу начинать вставку строк, когда они действительно существуют.

Нужен совет, чтобы убедиться, что я делаю это правильно.

1 Ответ

0 голосов
/ 05 ноября 2018

Что касается "лучших практик", лучше разместить на выделенный SO-сайт .

var ErrUserNotFound = errors.New("User not found")

func (dbs *DbService) GetUserLocationId(locationId int) (user User, err error)
    record := dbs.deps.db.Where("location_id = ?", locationId).Find(&user)
    if record.RecordNotFound() {
        err = ErrUserNotFound
    }
    return
}

Хорошо, это ближе к GO "лучшие практики" стандартов ИМХО. Рекомендуется создавать значения ошибок пакета для часто возвращаемых ошибок. Это помогает вызывающей стороне правильно обрабатывать каждый случай (если таковой должен быть), но здесь это не совсем так.

Что касается другого фрагмента, вы действительно не захотите делать это так. Прежде всего вы опустили приемник указателя для обоих методов GetUserLocationById и InsertNewUser. Тогда, как правило, вы не хотите скрывать родительскую переменную scope err, но она ok здесь ...

user, err := dbs.GetUserLocationById(123)
if err != nil {
   err = dbs.InsertNewUser(user)
   // handle err here
}

В любом случае, я думаю, что делать это с ошибками слишком плохо, потому что здесь нет действительно других возможностей, кроме "ErrUserNotFound". Я бы посоветовал перейти на логический ok.

func (dbs *DbService) GetUserLocationId(locationId int) (user User, ok bool)
    record := dbs.deps.db.Where("location_id = ?", locationId).Find(&user)
    ok = !record.RecordNotFound()
    return
}

, а затем

var user User
if user, ok := dbs.GetUserLocationId(123); !ok {
    if err := dbs.InsertNewUser(user); err != nil {
        panic(err)
    }
}
...