Как получить RowsAffect в режиме ассоциации Go-Gorm - PullRequest
0 голосов
/ 04 мая 2019

Я вставляю отношение с помощью следующего кода:

db.Where(exercise).FirstOrCreate(&exercise).Model(&User{ID: userID}).Association("Exercises").Append(&exercise)

Соответствующий SQL, напечатанный консолью отладки, к коду:

INSERT INTO `user_exercise` (`user_id`,`exercise_id`) SELECT 1,1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM `user_exercise` WHERE `user_id` = 1 AND `exercise_id` = 1)  

Я хочу знать, есть ли новые записи, созданные в user_exercise, но из-за сгенерированного SQL, если отношение в user_exercise уже существует, оно не будет вставлено и не выдаст ошибку.

Объект Go-Gorm Association не имеет атрибута RowsAffected, поэтому я не могу получить RowsAffected из запроса, чтобы подтвердить, создана ли новая запись.

Хотя я могу получить RowsAffected от первого db объекта, например

db.Where(exercise).FirstOrCreate(&exercise).Model(&User{ID: userID}).Association("Exercises").Append(&exercise)
if db.RowsAffected == 1 {
    // do something
}

Интересно, поскольку БД совместно используется всеми запросами, если другой запрос выполняется одновременно и затрагивает строки> 0, безопасно ли получать RowsAffected из глобального db объекта?

1 Ответ

1 голос
/ 05 мая 2019

Предполагая, что таблица user_execise имеет уникальное ограничение (user_id, training_id), вставка должна вернуть ошибку, если вы попытаетесь сделать это с уже созданной записью.(Именно то, что вы хотите) Так что просто сделайте что-то вроде этого ...

db.Where(exercise).FirstOrCreate(&exercise)
ue := struct {
  UserID uint
  ExerciseID uint
}{
  UserID: userID,
  ExerciseID exercise.ID
}
if err := db.Table("user_exercise").Create(&ue).Error; err != nil {
  // will enter here if it wasn't created
}

Если он не возвращает, ошибка означает, что была создана новая запись

...