原生SQL查询
先查看《最佳实践》一文中models/user.go
的定义
创建一个RawSeter
o := orm.NewOrm()
var r RawSeter
r = o.Raw("UPDATE user SET password = ? WHERE name = ?", "newpassword", "peng")
RawSeter的接口定义如下:
type RawSeter interface {
Exec() (sql.Result, error)
QueryRow(…interface{}) error
QueryRows(…interface{}) (int64, error)
SetArgs(…interface{}) RawSeter
Values(*[]Params, …string) (int64, error)
ValuesList(*[]ParamsList, …string) (int64, error)
ValuesFlat(*ParamsList, string) (int64, error)
RowsToMap(*Params, string, string) (int64, error)
RowsToStruct(interface{}, string, string) (int64, error)
Prepare() (RawPreparer, error)
}
Exec
执行 sql 语句,返回 sql.Result 对象
res, err := o.Raw("UPDATE user SET name = ?", "your").Exec()
if err == nil {
num, _ := res.RowsAffected()
fmt.Println("mysql row affected nums: ", num)
}
QueryRows
QueryRow 提供高级 sql mapper 功能,可以把查询出来的对象存储到struct中
var user User
err := o.Raw("SELECT * FROM user WHERE id = ?", 1).QueryRow(&user)
QueryRows
QueryRows 支持的对象还有 map 规则是和 QueryRow 一样的,但查询出来的对象集要存储在 slice 中
var users []User
num, err := o.Raw("SELECT * FROM user WHERE username like ?", "%" + "peng" + "%").QueryRows(&users)
Prepare
用于一次 prepare 多次 exec,以提高批量执行的速度。
p, err := o.Raw("UPDATE user SET password = ? WHERE name = ?").Prepare()
res, err := p.Exec("testing", "slene")
res, err = p.Exec("testing", "astaxie")
...
...
p.Close() // 别忘记关闭 statement
Last updated
Was this helpful?