在上节内容中,我们介绍了xorm框架表结构的映射规则和表结构的操作。本节课,继续来深入学习表结构基本操作和高级查询的相关功能。

表结构基本操作

对表结构的操作最常见的操作是查询和统计相关的方法,我们首先来看相关实现:

var user User
engine.Id(1).Get(&user)
select * from user where id = 1
engine.Id(core.PK(1,"davie").Get(&user)
select * from user where id = 1 and name = 'davie'
engine.Where(" user_name = ? and pwd = ? ", 'davie', '123').Get(&admin)
select * from admin where user_name = 'davie' and pwd = '123'
engine.Id(1).And(" user_name = ?",'davie").Get(&user)
select * from user where id = 1 and user_name = 'davie' 
engine.Id(1).Or("user_name = ?",'davie').Get(&user)
select * from user where id = 1 or user_name = davie
engine.SQL(" select * from user where id = 1 nad user_name = 'davie')
engine.In('user_name','davie','pony','jack').Find()
  engine.Cols("user_name","status").Find(&admins)
//select user_name, status from admin
  engine.Cols("user_name","status").Update(&admin)
//update admin set user_name = admin.User_name and status = admin.Status

增删改查操作

说了这么多条件查询的内容,我们还没有介绍基本的表记录的增删改查操作呢。如下我们一一进行介绍:

var user
...
engine.Insert(&user)
  user := new(User)
count,err := engine.Id(id).Delete(user)
  admin := new(Admin)
admin.Status = "1"
count,err := engine.Id(id).Update(user)

Count表结构统计功能

在进行表数据查询时,我们时长需要统计数据的条数,比如数据一共多少条,用来做分页处理;再比如统计用户数量,也需要使用到计数功能。框架提供给我们Count方法来实现数据统计功能,如下是一个简单的案例:

admin := new(Admin)
count,err := engine.Count(admin)

事务处理

同其他数据库框架一样,xorm也是支持事物操作的。在有需要的批量操作数据时,事务的使用往往是必要的。在xorm中,事务操作和Session联系在一起。一共三个步骤,分别为:创建session对象,Begin表示事务开始执行,Commit表示提交事务。中间为具体的数据库操作。

创建事务
session := engine.NewSession()
defer session.Close()
事务开始
err := session.Begin()
//事务相关操作
事务提交
err = session.Commit()
if err != nil{
  panic(err.Error())
}
事务回滚

当在执行事务过程中遇到任何错误时,应该及时停止事务,将已经执行的进行回滚。回滚使用的方法是Rollback方法, 只是在执行出现错误时进行回滚操作。

...
if err != nil {
  session.Rollback()
  return
}

中间的事务相关操作,与我们的正常的数据库操作相同,支持开发者根据自己需求进行多种操作。比如插入数据和更改输入:

admin := Admin{Name: "Davie", Status: "1"}
_, err = session.Insert(&admin)
admin := Admin{ Name:"Davie"}
count,err := session.Id(2).Update(&admin)
if err != nil {
  seesion.Rollback()
  return
}