使用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 语言的新手。
如果你想为其他结构体添加类似外键约束的关系,可以在 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 的默认行为问题。

