乐观锁/更新时间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原来的值。
*/
var user User
has, err := engine.Id(1).Get(&user)
if err != nil {
log.Fatal(err)
return
}
if has {
fmt.Println("乐观锁,初始的userName:", user.Name, " 初始的version:", user.Version, "更新时间:", user.UpdatedAt)
}
user.Name = "version2Name"
affected, err := engine.Id(1).Update(&user)
if err != nil {
log.Fatal(err)
return
}
fmt.Println("乐观锁,改变了的数据库记录数:", affected, " 改变后的userName:", user.Name,
" 改变后的version:", user.Version, "更新时间:", user.UpdatedAt)
/*
更新时间Updated可以让您在记录插入或每次记录更新时自动更新数据库中的标记字段为当前时间,
需要在xorm标记中使用updated标记,对应的字段可以为time.Time或者自定义的time.Time或者int,int64等int类型。
在Insert(), InsertOne(), Update()方法被调用时,updated标记的字段将会被自动更新为当前时间
*/
var user1 User
has, err = engine.Id(2).Get(&user1)
if err != nil {
log.Fatal(err)
return
}
if has {
fmt.Println("更新时间Updated,初始的userName:", user1.Name, " 初始的version:", user1.Version, "更新时间:", user1.UpdatedAt)
}
affected, err = engine.Id(2).Update(&user1)
if err != nil {
log.Fatal(err)
return
}
fmt.Println("更新时间Updated,改变了的数据库记录数:", affected, " 改变后的userName:", user1.Name,
" 改变后的version:", user1.Version, "更新时间:", user1.UpdatedAt)
/* 如果你希望临时不自动插入时间,则可以组合NoAutoTime()方法:
engine.NoAutoTime().Insert(&user)
这个在从一张表拷贝字段到另一张表时比较有用。
*/
var user2 User
has, err = engine.Id(3).Get(&user2)
if err != nil {
log.Fatal(err)
return
}
if has {
fmt.Println("临时不自动插入时间,初始的userName:", user2.Name, " 初始的version:", user2.Version, "更新时间:", user2.UpdatedAt)
}
affected, err = engine.Id(3).NoAutoTime().Update(&user2)
if err != nil {
log.Fatal(err)
return
}
fmt.Println("临时不自动插入时间,改变了的数据库记录数:", affected, " 改变后的userName:", user2.Name,
" 改变后的version:", user2.Version, "更新时间:", user2.UpdatedAt)
/*输出:
乐观锁,初始的userName: version2Name 初始的version: 2 更新时间: 2019-05-28 14:41:24 +0800 CST
乐观锁,改变了的数据库记录数: 1 改变后的userName: version2Name 改变后的version: 3 更新时间: 2019-05-28 14:44:02.386965 +0800 CST
更新时间Updated,初始的userName: u1 初始的version: 2 更新时间: 2019-05-28 14:41:24 +0800 CST
更新时间Updated,改变了的数据库记录数: 1 改变后的userName: u1 改变后的version: 3 更新时间: 2019-05-28 14:44:02.395314 +0800 CST
临时不自动插入时间,初始的userName: u2 初始的version: 2 更新时间: 2019-05-28 14:41:24 +0800 CST
临时不自动插入时间,改变了的数据库记录数: 1 改变后的userName: u2 改变后的version: 3 更新时间: 2019-05-28 14:41:24 +0800 CST
*/
}