我通过以下代码插入关系:
///////////////////////////////////////////////////
// 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
}
是否安全?
答案 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
}
如果未返回错误,则表示已创建新记录