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 */ }