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

abithluo  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(195)

客户端有许多角色。我想在删除客户端后删除所有角色。

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
        })

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

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

如何完全删除关联角色表中的行?
数据库为Postgres

mzsu5hc0

mzsu5hc01#

如文档中所述,关联删除操作只会删除ClientTenantRole之间的引用。在您的示例中,它只会更新TenantRole记录,将client_id设置为NULL。
如果您也想删除对象,可以尝试使用Select执行删除操作。请注意,这只在主键不为零时有效,因此您的查询可能类似于:

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

或者,如果已经填充了Id字段,则使用clientToRemove

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

相关问题