Go-Gorm的关联模式如何获取RowsAffected

How to get RowsAffected in Go-Gorm's Association Mode

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

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 以确认是否创建了新记录。

虽然我可以从第一个 db 对象中得到 RowsAffected,比如

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

我想知道,因为数据库是所有查询共享的,如果另一个查询同时执行并且影响行 > 0,从全局 db 对象获取 RowsAffected 是否安全?

假设 user_execise table 具有唯一约束(user_id、exercise_id),如果您尝试这样做,插入应该 return 出错它到一个已经创建的记录。 (正是你想要的) 所以就做这样的事情...

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
}

如果没有return错误意味着创建了一条新记录