我通过下面的代码插入一个关系:
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是否安全?
发布于 2019-05-05 07:07:20
假设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
}如果未返回错误,则表示已创建新记录
https://stackoverflow.com/questions/55980490
复制相似问题