package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/go-xorm/xorm" "log" ) var engine *xorm.Engine type User struct { Name string `xorm:"varchar(25) 'name'"` Id int `xorm:"pk 'id' autoincr"` } func main() { var err error engine, err = xorm.NewEngine("mysql", "root:123456@/test") if err != nil { log.Fatal(err) return } //建立表和插入数据 /*err = engine.CreateTables(User{}) if err != nil { log.Fatal(err) return } u := make([]User, 3) u[0].Name = "u0" u[1].Name = "u1" u[2].Name = "u2" _, err = engine.Insert(u) if err != nil { log.Fatal(err) return }*/ uu := new(User) has ,err :=engine.Id(2).Get(uu) if err !=nil { log.Fatal(err) return } if has { fmt.Println("删除Deleted,用户名:",uu.Name) }else { fmt.Println("该数据如今已经不存在") } affected, err := engine.Id(2).Delete(uu) if err != nil { log.Fatal(err) return } fmt.Println("删除Delete,受影响的行数:", affected) fmt.Println() has ,err =engine.Id(2).Get(uu) if err !=nil { log.Fatal(err) return } if has { fmt.Println("删除Deleted,用户名:",uu.Name,"deleteAt:") }else { fmt.Println("该数据如今已经不存在") } affected, err = engine.Id(2).Delete(uu) if err != nil { log.Fatal(err) return } fmt.Println("删除Delete,受影响的行数:", affected) fmt.Println() /* 输出: 删除Deleted,用户名: u1 删除Delete,受影响的行数: 1 该数据如今已经不存在 删除Delete,受影响的行数: 0 */ }
软删除Deleted, Deleted能够让您不真正的删除数据,而是标记一个删除时间。使用此特性须要在xorm标记中使用deleted标记,对应的字段必须为time.Time类型。在Delete()时,deleted标记的字段将会被自动更新为当前时间而不是去删除该条记录mysql
package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/go-xorm/xorm" "log" "time" ) var engine *xorm.Engine type User struct { Name string `xorm:"varchar(25) 'name'"` Id int `xorm:"pk 'id' autoincr"` Version int `xorm:"version"` UpdatedAt time.Time `xorm:"updated"` DeletedAt time.Time `xorm:"deleted"` } func main() { var err error engine, err = xorm.NewEngine("mysql", "root:123456@/test") if err != nil { log.Fatal(err) return } //建立表和插入数据 /* err = engine.CreateTables(User{}) if err != nil { log.Fatal(err) return } u := make([]User, 3) u[0].Name = "u0" u[1].Name = "u1" u[2].Name = "u2" _, err = engine.Insert(u) if err != nil { log.Fatal(err) return }*/ uu := new(User) has ,err :=engine.Id(2).Get(uu) if err !=nil { log.Fatal(err) return } if has { fmt.Println("软删除Deleted,用户名:",uu.Name,"deleteAt:",uu.DeletedAt) }else { fmt.Println("该数据如今已经不存在") } affected, err := engine.Id(2).Delete(uu) if err != nil { log.Fatal(err) return } fmt.Println("软删除Delete,受影响的行数:", affected) fmt.Println() has ,err =engine.Id(2).Get(uu) if err !=nil { log.Fatal(err) return } if has { fmt.Println("软删除Deleted,用户名:",uu.Name,"deleteAt:",uu.DeletedAt) }else { fmt.Println("该数据如今已经不存在") } affected, err = engine.Id(2).Delete(uu) if err != nil { log.Fatal(err) return } fmt.Println("软删除Delete,受影响的行数:", affected) fmt.Println() //那么若是记录已经被标记为删除后,要真正的得到该条记录或者真正的删除该条记录,须要启用Unscoped,以下所示: // 此时将能够得到记录,此时将能够真正的删除记录 has ,err =engine.Id(2).Unscoped().Get(uu) if err !=nil { log.Fatal(err) return } if has { fmt.Println("启用Unscoped,用户名:",uu.Name,"deleteAt:",uu.DeletedAt) }else { fmt.Println("该数据如今已经不存在") } affected, err = engine.Id(2).Unscoped().Delete(uu) if err != nil { log.Fatal(err) return } fmt.Println("启用Unscoped,受影响的行数:", affected) /* 输出: 软删除Deleted,用户名: u1 deleteAt: 0001-01-01 00:00:00 +0000 UTC 软删除Deleted,受影响的行数: 1 该数据如今已经不存在 软删除Deleted,受影响的行数: 0 启用Unscoped,用户名: u1 deleteAt: 2019-05-28 15:12:38 +0800 CST 启用Unscoped,受影响的行数: 1 */ }