首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Go-Gorm的关联模式中获取RowsAffected

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

Stack Overflow用户
提问于 2019-05-04 15:33:51
回答 1查看 1.4K关注 0票数 0

我通过下面的代码插入一个关系:

代码语言:javascript
复制
db.Where(exercise).FirstOrCreate(&exercise).Model(&User{ID: userID}).Association("Exercises").Append(&exercise)

调试控制台打印的代码对应的SQL为:

代码语言:javascript
复制
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,比如

代码语言:javascript
复制
db.Where(exercise).FirstOrCreate(&exercise).Model(&User{ID: userID}).Association("Exercises").Append(&exercise)
if db.RowsAffected == 1 {
    // do something
}

我想知道既然所有查询都共享数据库,那么如果同时执行另一个查询并且受影响的行数大于0,那么从全局db对象获取RowsAffected是否安全?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-05 07:07:20

假设user_execise表有一个唯一的约束(user_id,exercise_id),如果您试图对已经创建的记录执行插入操作,则插入操作应该返回一个错误。(这正是您想要的)所以只需这样做……

代码语言:javascript
复制
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
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55980490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档