如何获得受Go-Gorm关联模式影响的行

时间:2019-05-04 07:33:51

标签: mysql go go-gorm

我通过以下代码插入关系:

///////////////////////////////////////////////////
// possibly some comment why applying this pattern
goto SOME_LABEL;
///////////////////////////////////////////////////

调试控制台打印的与该代码对应的SQL是:

return

我想知道是否在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) 中的关系已经存在,则不会插入并且不会产生任何错误。

Go-Gorm的user_exercise对象没有user_exercise属性,因此我无法从查询中获取Association来确认是否创建了新记录。

尽管我可以从第一个RowsAffected对象中获得RowsAffected,例如

RowsAffected

我想知道既然所有查询都共享数据库,如果同时执行另一个查询并且受影响的行> 0,从全局db对象中获取db.Where(exercise).FirstOrCreate(&exercise).Model(&User{ID: userID}).Association("Exercises").Append(&exercise) if db.RowsAffected == 1 { // do something } 是否安全?

1 个答案:

答案 0 :(得分:1)

假定user_execise表具有唯一约束(user_id,exercise_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
}

如果未返回错误,则表示已创建新记录