删除记录
删除记录时,被删除的值需要具有主键,否则将触发批量删除,例如
// Email's ID is `10` |
使用主键删除
GORM 允许使用带有内联条件的主键删除对象,它适用于数字,有关详细信息,请查看查询内联条件
db.Delete(&User{}, 10) |
删除钩子
GORM 允许使用钩子 BeforeDelete
、AfterDelete
,这些方法将在删除记录时被调用,有关详细信息,请参阅钩子
func (u *User) BeforeDelete(tx *gorm.DB) (err error) { |
批量删除
指定的值没有主键值,GORM 将执行批量删除,它将删除所有匹配的记录
db.Where("email LIKE ?", "%jinzhu%").Delete(&Email{}) |
要有效地删除大量记录,请将包含主键的切片传递给 Delete
方法。
var users = []User{{ID: 1}, {ID: 2}, {ID: 3}} |
阻止全局删除
如果您在没有任何条件的情况下执行批量删除,GORM 将不会运行它,并且将返回 ErrMissingWhereClause
错误
您必须使用某些条件或使用原始 SQL 或启用 AllowGlobalUpdate
模式,例如
db.Delete(&User{}).Error // gorm.ErrMissingWhereClause |
从已删除的行返回数据
返回已删除的数据,仅适用于支持 Returning 的数据库,例如
// return all columns |
软删除
如果您的模型包含 gorm.DeletedAt
字段(包含在 gorm.Model
中),它将自动获得软删除功能!
调用 Delete
时,记录不会从数据库中删除,但 GORM 会将 DeletedAt
的值设置为当前时间,并且无法再使用普通查询方法找到数据。
// user's ID is `111` |
如果您不想包含 gorm.Model
,则可以像这样启用软删除功能
type User struct { |
查找软删除的记录
您可以使用 Unscoped
查找软删除的记录
db.Unscoped().Where("age = 20").Find(&users) |
永久删除
您可以使用 Unscoped
永久删除匹配的记录
db.Unscoped().Delete(&order) |
删除标志
默认情况下,gorm.Model
使用 *time.Time
作为 DeletedAt
字段的值,并且它通过插件 gorm.io/plugin/soft_delete
提供其他数据格式支持
信息 为 DeletedAt 字段创建唯一复合索引时,您必须使用其他数据格式,例如使用插件
gorm.io/plugin/soft_delete
的帮助下的 unix 秒/标志,例如
import "gorm.io/plugin/soft_delete"
type User struct {
ID uint
Name string `gorm:"uniqueIndex:udx_name"`
DeletedAt soft_delete.DeletedAt `gorm:"uniqueIndex:udx_name"`
}
Unix 秒
使用 unix 秒作为删除标志
import "gorm.io/plugin/soft_delete" |
您还可以指定使用 毫秒
或 纳秒
作为值,例如
type User struct { |
使用 1
/ 0
作为删除标志
import "gorm.io/plugin/soft_delete" |
混合模式
混合模式可以使用 0
、1
或 unix 秒来标记数据是否已删除,并同时保存删除时间。
type User struct { |