补充: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)