github.com/astaxie/beego/orm 使用总结

整合 学习 GO
阅读数: 2002 2019年09月12日

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是构造查询语句,不可直接查询),
然后根据不同查询方式获得结果或执行。

参考资料
https://beego.me/docs/mvc/model/overview.md
phpriji.cn | 网站地图 | 沪ICP备17015433号-1