登录
首页 >  Golang >  Go问答

Gorm 多对多关系中,循环内记录的永久删除未生效

来源:stackoverflow

时间:2024-02-20 23:36:25 198浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《Gorm 多对多关系中,循环内记录的永久删除未生效》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我有一个连接表,用于保存程序中用户和项目之间的关系。 我有一个更新端点,它尝试向用户添加项目(如果它们已经不存在),否则它将删除相关性。 我无法永久删除该记录。 我尝试过使用两种推荐的方法

  • session(&gorm.session{allowglobalupdate: true})
  • 无作用域()
// userprojects join table for linking projects to users.
type userprojects struct {
    userid          uint
    projectid       uint
}

func updateuserprojects(db *gorm.db, userid uint, projects []project) error {
    for _, project := range projects {
        userproject := userprojects{
            userid:     userid,
            projectid:  project.id,
        }
        dump.p(userproject)

        result := db.debug().create(userproject)
        if result.error != nil {
            // record already exists in db, will be removed instead of being inserted.
            if result.error.(*mysql.mysqlerror).number == 1062 {
                //if result := db.debug().session(&gorm.session{allowglobalupdate: true}).delete(&userproject); result.error != nil {
                if result := db.debug().unscoped().delete(&userproject); result.error != nil {
                    dump.p(result.error)
                }
                fmt.println("project was not inserted, but instead removed!")
                continue
            }
            fmt.println("sql create error return")
        }
        fmt.println("project attached to user")
    }

    return nil
}
mysql> desc user_projects;
+------------+-----------------+------+-----+---------+-------+
| Field      | Type            | Null | Key | Default | Extra |
+------------+-----------------+------+-----+---------+-------+
| user_id    | bigint unsigned | NO   | PRI | NULL    |       |
| project_id | bigint unsigned | NO   | PRI | NULL    |       |
+------------+-----------------+------+-----+---------+-------+

使用 unscoped() 时出错 需要 where 条件

使用 session(&gorm.session{allowglobalupdate: true}) 时没有错误


正确答案


gorm 抱怨 unscoped() 因为它无法在没有 where 子句 的情况下使用当前的 userprojects 结构形成任何要删除的查询(无 gorm 标签)。

用相关标签声明它,至少primarykey和unscoped()删除可以工作。

type UserProjects struct {
    UserID    uint `gorm:"primaryKey"`
    ProjectID uint `gorm:"primaryKey"`
}

本篇关于《Gorm 多对多关系中,循环内记录的永久删除未生效》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>