• 使用SQL语句进行查询
    • Exec
    • QueryRow
    • QueryRows
    • SetArgs
    • Values / ValuesList / ValuesFlat
    • Values
    • ValuesList
    • ValuesFlat
    • RowsToMap
    • RowsToStruct
    • Prepare

    使用SQL语句进行查询

    • 使用 Raw SQL 查询,无需使用 ORM 表定义
    • 多数据库,都可直接使用占位符号 ?,自动转换
    • 查询时的参数,支持使用 Model Struct 和 Slice, Array
    1. ids := []int{1, 2, 3}
    2. p.Raw("SELECT name FROM user WHERE id IN (?, ?, ?)", ids)

    创建一个 RawSeter

    1. o := orm.NewOrm()
    2. var r RawSeter
    3. r = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene")
    • 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 对象

    1. res, err := o.Raw("UPDATE user SET name = ?", "your").Exec()
    2. if err == nil {
    3. num, _ := res.RowsAffected()
    4. fmt.Println("mysql row affected nums: ", num)
    5. }

    QueryRow

    QueryRow 和 QueryRows 提供高级 sql mapper 功能

    支持 struct

    1. type User struct {
    2. Id int
    3. UserName string
    4. }
    5. var user User
    6. err := o.Raw("SELECT id, user_name FROM user WHERE id = ?", 1).QueryRow(&user)

    from beego 1.1.0 取消了多个对象支持 ISSUE 384

    QueryRows

    QueryRows 支持的对象还有 map 规则是和 QueryRow 一样的,但都是 slice

    1. type User struct {
    2. Id int
    3. UserName string
    4. }
    5. var users []User
    6. num, err := o.Raw("SELECT id, user_name FROM user WHERE id = ?", 1).QueryRows(&users)
    7. if err == nil {
    8. fmt.Println("user nums: ", num)
    9. }

    from beego 1.1.0 取消了多个对象支持 ISSUE 384
    ```

    SetArgs

    改变 Raw(sql, args…) 中的 args 参数,返回一个新的 RawSeter

    用于单条 sql 语句,重复利用,替换参数然后执行。

    1. res, err := r.SetArgs("arg1", "arg2").Exec()
    2. res, err := r.SetArgs("arg1", "arg2").Exec()
    3. ...

    Values / ValuesList / ValuesFlat

    Raw SQL 查询获得的结果集 Value 为 string 类型,NULL 字段的值为空 ``

    from beego 1.1.0
    Values, ValuesList, ValuesFlat 的参数,可以指定返回哪些 Columns 的数据
    通常情况下,是无需指定的,因为 sql 语句中你可以自行设置 SELECT 的字段

    Values

    返回结果集的 key => value 值

    1. var maps []orm.Params
    2. num, err = o.Raw("SELECT user_name FROM user WHERE status = ?", 1).Values(&maps)
    3. if err == nil && num > 0 {
    4. fmt.Println(maps[0]["user_name"]) // slene
    5. }

    ValuesList

    返回结果集 slice

    1. var lists []orm.ParamsList
    2. num, err = o.Raw("SELECT user_name FROM user WHERE status = ?", 1).ValuesList(&lists)
    3. if err == nil && num > 0 {
    4. fmt.Println(lists[0][0]) // slene
    5. }

    ValuesFlat

    返回单一字段的平铺 slice 数据

    1. var list orm.ParamsList
    2. num, err = o.Raw("SELECT id FROM user WHERE id < ?", 10).ValuesFlat(&list)
    3. if err == nil && num > 0 {
    4. fmt.Println(list) // []{"1","2","3",...}
    5. }

    RowsToMap

    SQL 查询结果是这样

    name value
    total 100
    found 200

    查询结果匹配到 map 里

    1. res := make(orm.Params)
    2. nums, err := o.Raw("SELECT name, value FROM options_table").RowsToMap(&res, "name", "value")
    3. // res is a map[string]interface{}{
    4. // "total": 100,
    5. // "found": 200,
    6. // }

    RowsToStruct

    SQL 查询结果是这样

    name value
    total 100
    found 200

    查询结果匹配到 struct 里

    1. type Options struct {
    2. Total int
    3. Found int
    4. }
    5. res := new(Options)
    6. nums, err := o.Raw("SELECT name, value FROM options_table").RowsToStruct(res, "name", "value")
    7. fmt.Println(res.Total) // 100
    8. fmt.Println(res.Found) // 200

    匹配支持的名称转换为 snake -> camel, eg: SELECT user_name … 需要你的 struct 中定义有 UserName

    Prepare

    用于一次 prepare 多次 exec,以提高批量执行的速度。

    1. p, err := o.Raw("UPDATE user SET name = ? WHERE name = ?").Prepare()
    2. res, err := p.Exec("testing", "slene")
    3. res, err = p.Exec("testing", "astaxie")
    4. ...
    5. ...
    6. p.Close() // 别忘记关闭 statement