使用GORM时遇到"Unknown column 'users.deleted_at' in 'where clause'"错误如何解决

使用GORM时遇到"Unknown column ‘users.deleted_at’ in ‘where clause’"错误如何解决 如何阻止 GORM 抱怨 deleted_at 字段?我知道可以使用不包含 gorm.Model 的普通结构体,但这意味着我无法为用户/其他结构体添加关联关系……例如,如果我不添加 gorm.Model,就无法在 User 结构体中声明用户拥有一个语言关联;但如果我添加了,它又会抱怨 deleted_at 字段不存在,尽管该字段确实不存在。非常感谢任何帮助。我尝试了一些标签组合,例如添加了 DeletedAt 字段并给它标签:1. gorm: “-”,然后我也尝试了 json: “-” 来忽略它,但仍然没有成功。 这看起来是一个非常基础的问题,但我没能解决,抱歉,我是 Go 语言的新手。


3 回复

如果你想为其他结构体添加类似外键约束的关系,可以在 GORM 中使用外键标签来实现。你想在两个不同的结构体之间添加什么类型的关系?


感谢您的回复。我在 GORM 文档的约定部分 找到了答案。

我没有使用 gorm.Model,而是创建了自己的基础模型,并且没有在其中使用 deleted_at 字段。这样效果很好。

编辑: 看来我之前的理解有误。我可以使用任何基础结构体,关联功能都能正常工作。只是不要将 gorm.Model 用作基础模型。

这是一个常见的 GORM 问题,通常发生在使用软删除但数据库表缺少 deleted_at 字段时。以下是几种解决方案:

方案1:自定义模型结构体(推荐)

type BaseModel struct {
    ID        uint           `gorm:"primarykey"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt gorm.DeletedAt `gorm:"index"`
}

type User struct {
    BaseModel
    Name     string
    Email    string
    Language Language `gorm:"foreignKey:UserID"`
}

type Language struct {
    ID     uint   `gorm:"primarykey"`
    Name   string
    UserID uint
}

方案2:禁用特定表的软删除

type User struct {
    gorm.Model
    Name     string
    Email    string
    Language Language `gorm:"foreignKey:UserID"`
}

// 在查询时禁用软删除
db.Unscoped().Where("id = ?", 1).First(&user)

方案3:完全禁用软删除功能

type User struct {
    gorm.Model
    Name     string
    Email    string
    Language Language `gorm:"foreignKey:UserID"`
}

// 全局禁用软删除
db = db.Session(&gorm.Session{
    SkipDefaultTransaction: true,
    QueryFields: true,
})

// 或者使用自定义模型
type User struct {
    ID        uint      `gorm:"primarykey"`
    CreatedAt time.Time
    UpdatedAt time.Time
    Name      string
    Email     string
    Language  Language `gorm:"foreignKey:UserID"`
}

方案4:添加 deleted_at 字段到数据库

-- 如果使用 MySQL
ALTER TABLE users ADD COLUMN deleted_at TIMESTAMP NULL DEFAULT NULL;
CREATE INDEX idx_users_deleted_at ON users(deleted_at);

方案5:使用指针类型避免自动查询

type User struct {
    ID        uint            `gorm:"primarykey"`
    CreatedAt time.Time
    UpdatedAt time.Time
    DeletedAt *time.Time      `gorm:"index"`
    Name      string
    Email     string
    Language  Language        `gorm:"foreignKey:UserID"`
}

最推荐的是方案1,它提供了最大的灵活性,同时避免了 gorm.Model 的默认行为问题。

回到顶部