原生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?