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错误意味着创建了一条新记录
我通过以下代码插入关系:
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错误意味着创建了一条新记录