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