补充:xorm框架高级部分 · Golang原生Web开发入门到微服务 · 看云
补充:xorm高级部分
===
### 事务及回滚
- 创建session对象
`sess := Engine.NewSession()`
- 启动事任
`sess.Begin()`
- 通过session操作数据库
`sess.Update()`
- 发生错误进行回滚
`sess.RollBack()`
- 提交事务
`sess.Commit()`
为什么要用到事务?保证数据的一致性 原子性 隔离性 持久性
我们就吧那个转账模块修改一下吧
```
func TransferAccounts(form,to string,balance float64) error {
session := Engine.NewSession() // 获得session
defer session.Close() // session会消耗资源 所以要关闭
err := session.Begin() //开启事务
if err != nil {
return errors.New("session begin error")
}
account := &Account{Name: form}
_, e := Engine.Get(account)
if e != nil {
return e
}
if account.Balance > balance{
account.Balance -= balance
}
account2 := &Account{Name:to}
b, e := Engine.Get(account2)
if b != true || e!= nil{
return errors.New("Error")
}
account2.Balance += balance
_, e = Engine.Where("name = ?",account.Name).Update(account)
if e!=nil{
session.Rollback() //回滚
return e
}
_, e = Engine.Where("name = ?",account2.Name).Update(account2)
if e!=nil{
session.Rollback() //回滚
}
return session.Commit() //提交
}
```
### 这节课程的大块头讲完了,就是小部分了
#### 统计
- 统计某个表中服务条件的所有记录条数
`Engine.Count(new(Account))`
- 配合链式操作
`Engine.Where("id > 10").Count(new(Account))`
#### 迭代查询
- 迭代查询某个表中符合条件的所有记录
```
Engine.Iterate(new(Account),func(idx int,bean interface{}) {
fmt.Printf("%d,%#v\n",idx,bean.(*Account))
})
```
- 使用Rows对象
`rows,err := Engine.Rows(new(Account))`
```
func row() {
rows, _ := Engine.Rows(new(Account))
defer rows.Close()
account := new(Account)
for rows.Next() {
rows.Scan(account)
}
}
```
#### 常用查询方法
- 当只有结构中的某个字段的值对你有价值时:
`Engine.Clos("name").Get(..)`
- 忽略指定字段
`Engine.Omit("name").Find(...)`
- 分页
`Engine.Limit(3,2).Find(...)`
#### 日志记录
- 开启日志
`Engine.ShowSQL = true`
- 将日志保存到文件
```
f,_ := os.Create("sql.log")
Engine.Logger = xorm.NewSimpleLogger(f)
```
#### LRU缓存
- 开启默认LRU缓存
```
cacher := xormNewLRUCacher(xorm.NewMemoryStore(),1000)
Engine.SetDefaultCacher(cacher)
```
#### 事件钩子
这个去看官方文档吧....
本次课程代码:
[https://github.com/dollarkillerx/GolangWebCourseware/tree/xorm](https://github.com/dollarkillerx/GolangWebCourseware/tree/xorm)