Gorm 关联删除不会删除行,而是更新行

问题描述 投票:0回答:2

一个客户有很多角色。我想在删除客户端后删除所有角色。

 type Client struct {
        Id                          string `gorm:"primaryKey"`
        CreatedAt                   time.Time
        UpdatedAt                   time.Time
        Roles [] Role
    }
    
    type Role struct {
        Id        uint `gorm:"primarykey"`
        CreatedAt time.Time
        UpdatedAt time.Time
    
        ClientID string
    }
    
    return db.Transaction(func(tx *gorm.DB) error {
            err = db.Model(&clientToRemove).Association("Roles").Delete(&clientToRemove.Roles)
            if err != nil {
                return err
            }
    
            err = db.Delete(&clientToRemove).Error
            if err != nil {
                return err
            }
    
            return nil
        })

我希望删除角色中的相关行,而不是删除查询,而是执行更新查询来删除 client_id。

[210.834ms] [rows:1] UPDATE "role" SET "client_id"=NULL WHERE "role"."client_id" = 'xxxxxxxxxxx' AND "role"."id" = 9

如何完全删除关联角色表中的行?

数据库是Postgres

postgresql windows go go-gorm
2个回答
1
投票

文档中所述,关联删除操作只会删除

Client
TenantRole
之间的引用。在您的情况下,它只是更新了
TenantRole
记录以将
client_id
设置为 NULL。

如果您也想删除对象,可以尝试使用

Select
进行删除操作。请注意,这仅在主键不为零时才有效,因此您的查询可能如下所示:

err = db.Select("TenantRoles").Delete(&Client{Id: clientId}).Error

或者如果已经填充了

clientToRemove
字段,则只需使用
Id

err = db.Select("TenantRoles").Delete(&clientToRemove).Error

0
投票

使用

Unscoped()
。如文档中所述。

使用 Unscoped 修改删除行为

对于需要实际删除关联记录的场景,Unscoped 方法会改变此行为。

  • 软删除:将关联记录标记为已删除(设置deleted_at字段),而不将它们从数据库中删除。
db.Model(&user).Association("Languages").Unscoped().Clear()
  • 永久删除:从数据库中物理删除关联记录。
// db.Unscoped().Model(&user)
db.Unscoped().Model(&user).Association("Languages").Unscoped().Clear()
© www.soinside.com 2019 - 2024. All rights reserved.