• 软删除Deleted

    软删除Deleted

    Deleted可以让您不真正的删除数据,而是标记一个删除时间。使用此特性需要在xorm标记中使用deleted标记,如下所示进行标记,对应的字段必须为time.Time类型。

    1. type User struct {
    2. Id int64
    3. Name string
    4. DeletedAt time.Time `xorm:"deleted"`
    5. }

    在Delete()时,deleted标记的字段将会被自动更新为当前时间而不是去删除该条记录,如下所示:

    1. var user User
    2. engine.Id(1).Get(&user)
    3. // SELECT * FROM user WHERE id = ?
    4. engine.Id(1).Delete(&user)
    5. // UPDATE user SET ..., deleted_at = ? WHERE id = ?
    6. engine.Id(1).Get(&user)
    7. // 再次调用Get,此时将返回false, nil,即记录不存在
    8. engine.Id(1).Delete(&user)
    9. // 再次调用删除会返回0, nil,即记录不存在

    那么如果记录已经被标记为删除后,要真正的获得该条记录或者真正的删除该条记录,需要启用Unscoped,如下所示:

    1. var user User
    2. engine.Id(1).Unscoped().Get(&user)
    3. // 此时将可以获得记录
    4. engine.Id(1).Unscoped().Delete(&user)
    5. // 此时将可以真正的删除记录