xorm-刪除和軟刪除實例

  • 刪除數據Delete方法,參數爲struct的指針而且成爲查詢條件。注意:當刪除時,若是user中包含有bool,float64或者float32類型,有可能會使刪除失敗
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
    */
    
    }
相關文章
相關標籤/搜索