ORM 是对 sql 操作的封装,定义操作类型如下:
1、已知主键情况下,针对对象的 CRUD 的简单操作;https://beego.me/docs/mvc/model/object.md
o := orm.NewOrm() user := new(User) user.Name = "slene" fmt.Println(o.Insert(user)) user.Name = "Your" fmt.Println(o.Update(user)) fmt.Println(o.Read(user)) fmt.Println(o.Delete(user))
2、高级查询:先获得 QuerySeter 然后进行更多操作:https://beego.me/docs/mvc/model/query.md
需要创建模型,且在使用 where 的时候,需要使用特定的条件符号(有学习成本)
o := orm.NewOrm()
// 获取 QuerySeter 对象,user 为表名
qs := o.QueryTable("user")
// 也可以直接使用对象作为表名
user := new(User)
qs = o.QueryTable(user) // 返回 QuerySeter
3、原生 SQL 查询:https://beego.me/docs/mvc/model/rawsql.md
直接获得 RawSeter (然后操作),无需使用 ORM 表定义,直接使用原始 sql 编写(无需单独编写 where),相当于通过安全的 sql 操作表。
o := orm.NewOrm()
var r RawSeter
r = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene")
4、构造查询:https://beego.me/docs/mvc/model/querybuilder.md
可以构造更复杂的查询语句,通过 QueryBuilder 构建查询语句。
当直接使用 o.Raw() 无法满足需求的情况下用这个来构造查询语句。
最后还得通过 o.Raw(QueryBuilder) 获得 RawSeter 后,再操作获得结果。
// User 包装了下面的查询结果
type User struct {
Name string
Age int
}
var users []User
// 获取 QueryBuilder 对象. 需要指定数据库驱动参数。
// 第二个返回值是错误对象,在这里略过
qb, _ := orm.NewQueryBuilder("mysql")
// 构建查询对象
qb.Select("user.name",
"profile.age").
From("user").
InnerJoin("profile").On("user.id_user = profile.fk_user").
Where("age > ?").
OrderBy("name").Desc().
Limit(10).Offset(0)
// 导出 SQL 语句
sql := qb.String()
// 执行 SQL 语句
o := orm.NewOrm()
o.Raw(sql, 20).QueryRows(&users)5、事务处理:https://beego.me/docs/mvc/model/transaction.md,使用简单
o := NewOrm()
err := o.Begin()
// 事务处理过程
...
...
// 此过程中的所有使用 o Ormer 对象的查询都在事务处理范围内
if SomeError {
err = o.Rollback()
} else {
err = o.Commit()
}总结:所有操作都必须基于 orm.NewOrm() 获得一个连接,然后在连接里面来设置使用方式:QuerySeter 或 RawSeter (QueryBuilder是构造查询语句,不可直接查询),
然后根据不同查询方式获得结果或执行。