在gorm这个ORM框架中,默认情况下,只要我们的表中包含了字段 deleted_at , 模型中包含的字段类型为 gorm.DeletedAt 那么这个情况下我们的模型就拥有了软删除功能。 当调用Delete
时,GORM并不会从数据库中删除该记录,而是将该记录的DeleteAt
设置为当前时间,而后的一般查询方法将无法查找到此条记录。
gorm软删除示例
// user's ID is `111`
db.Delete(&user)
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE id = 111;
// Batch Delete
db.Where("age = ?", 20).Delete(&User{})
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;
// Soft deleted records will be ignored when querying
db.Where("age = 20").Find(&user)
// SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;
如果你并不想嵌套gorm.Model
,你也可以像下方例子那样开启软删除特性:
type User struct {
ID int
Deleted gorm.DeletedAt
Name string
}
|
查找被软删除的记录
你可以使用Unscoped
来查询到被软删除的记录
db.Unscoped().Where("age = 20").Find(&users) // SELECT * FROM users WHERE age = 20; |
永久删除
你可以使用 Unscoped
来永久删除匹配的记录
db.Unscoped().Delete(&order) // DELETE FROM orders WHERE id=10; |
删除标志
默认情况下,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 {
ID uint
Name string
DeletedAt soft_delete.DeletedAt
}
// 查询
SELECT * FROM users WHERE deleted_at = 0;
// 软删除
UPDATE users SET deleted_at = /* current unix second */ WHERE ID = 1;
你同样可以指定使用毫秒 milli
或纳秒 nano
作为值,如下例:
type User struct {
ID uint
Name string
DeletedAt soft_delete.DeletedAt `gorm:"softDelete:milli"`
// DeletedAt soft_delete.DeletedAt `gorm:"softDelete:nano"`
}
// 查询
SELECT * FROM users WHERE deleted_at = 0;
// 软删除
UPDATE users SET deleted_at = /* current unix milli second or nano second */ WHERE ID = 1;
使用 1
/ 0
作为 删除标志
import "gorm.io/plugin/soft_delete"
type User struct {
ID uint
Name string
IsDel soft_delete.DeletedAt `gorm:"softDelete:flag"`
}
// 查询
SELECT * FROM users WHERE is_del = 0;
// 软删除
UPDATE users SET is_del = 1 WHERE ID = 1;
混合模式
混合模式可以使用 0
,1
或者unix时间戳来标记数据是否被软删除,并同时可以保存被删除时间
type User struct {
ID uint
Name string
DeletedAt time.Time
IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` // use `1` `0`
// IsDel soft_delete.DeletedAt `gorm:"softDelete:,DeletedAtField:DeletedAt"` // use `unix second`
// IsDel soft_delete.DeletedAt `gorm:"softDelete:nano,DeletedAtField:DeletedAt"` // use `unix nano second`
}
// 查询
SELECT * FROM users WHERE is_del = 0;
// 软删除
UPDATE users SET is_del = 1, deleted_at = /* current unix second */ WHERE ID = 1;