zoukankan      html  css  js  c++  java
  • 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标记的字段将会被自动更新为当前时间而不是去删除该条记录

      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
      */
      
      }
      
  • 相关阅读:
    hdu_5791_Two(DP)
    hdu_5783_Divide the Sequence(贪心)
    hdu_5769_Substring(后缀数组)
    hdu_5778_abs(暴力)
    hdu_5776_sum(前缀和维护)
    hdu_5777_domino(贪心)
    [wikioi2069]油画(贪心)
    [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)
    数据结构练习
    [poj3274]排排站(Hash)
  • 原文地址:https://www.cnblogs.com/jiangxiangxiang/p/10937723.html
Copyright © 2011-2022 走看看