设为首页 加入收藏

TOP

xorm - Update,乐观锁,更新时间updated,NoAutoTime()(一)
2019-05-28 16:08:22 】 浏览:141
Tags:xorm Update 乐观 更新 时间 updated NoAutoTime

  • 更新数据使用Update方法

  • Update方法的第一个参数为需要更新的内容,可以为一个结构体指针或者一个Map[string]interface{}类型。
    • 当传入的为结构体指针时,只有非nil和非0的field才会被作为更新的字段,也就是说结构体至少要有一个字段被赋予非0值
    • 当传入的为Map类型时,key为数据库Column的名字,value为要更新的内容。
  • Update方法将返回两个参数:
    • 第一个为更新的记录数,需要注意的是 SQLITE 数据库返回的是根据更新条件查询的记录数而不是真正受更新的记录数。
  • 如果需要更新一个值为0,有两种选择:
    • 通过添加Cols函数指定需要更新结构体中的哪些值,未指定的将不更新,指定了的即使为0也会更新。
    • 通过传入map[string]interface{}来进行更新,但这时需要额外指定更新到哪个表,因为通过map是无法自动检测更新哪个表的。
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"`
  Money     int       `xorm:" 'money' "`
  Age       int       `xorm:"age"`
  CreatedAt time.Time `xorm:"created"`
}

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[0].Money = 1
  u[0].Age = 1
  u[1].Name = "u1"
  u[1].Money = 2
  u[1].Age = 1
  u[2].Name = "u2"
  u[2].Money = 3
  u[2].Age = 1

  _, err = engine.Insert(u)
  if err != nil {
      log.Fatal(err)
      return
  }*/


  u1 := new(User)
  u1.Money = 2
  affected, err := engine.Id(1).Update(u1)
  if err != nil {
      log.Fatal(err)
  }
  fmt.Println("第一个参数为结构体指针,结构体中更新的数据不是0值时,受影响的行数:", affected)


  u2 := new(User)
  u2.Money = 0
  affected, err = engine.Id(1).Cols("money").Update(u2)
  if err != nil {
      log.Fatal(err)
  }
  fmt.Println("第一个参数为结构体指针,结构体中更新的数据是0值,Cols函数指定需要更新结构体中的哪些值时,受影响的行数:", affected)

  affected, err = engine.Table(new(User)).Id(2).Update(map[string]interface{}{"age":0})
  fmt.Println("第一个参数为map,0值,受影响的行数:", affected)

  u3 := new(User)
  u3.Money = 0
  affected, err = engine.Id(1).Update(u3)
  if err != nil {
      log.Fatal(err)
  }
  fmt.Println("第一个参数为结构体指针,结构体中更新的数据是0值时,受影响的行数:", affected)


/*
    如果传入的数据和数据库原有的数据相同时上面第一个方法受影响的行数就是0行,不同时上面第一个方法受影响的行数就是1行,输出:
      第一个参数为结构体指针,结构体中更新的数据不是0值时,受影响的行数: 1
      第一个参数为结构体指针,结构体中更新的数据是0值,Cols函数指定需要更新结构体中的哪些值时,受影响的行数: 1
    第一个参数为map,0值,受影响的行数: 1
      2019/05/28 11:51:35 No content found to be updated
*/

}
  • 乐观锁/更新时间update/不自动更新时间NoAutoTime()

    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"`
    }
    
    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
      }*/
    
      /*
          要使用乐观锁,需要使用version标记
          在Insert时,version标记的字段将会被设置为1,在Update时,Update的内容必须包含version原来的值  
    		
    编程开发网
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇xorm-删除和软删除实例 下一篇golang两种在for循环中使用gorout..