zoukankan      html  css  js  c++  java
  • beego——原生SQL查询

    使用Raw SQL查询,无需使用ORM表定义。

    多数据库,都可直接使用占位符号?,自动转换。

    查询时的参数,支持使用Model Struct和Slice,Array

    ids := []int{1, 2, 3}
    p.Raw("SELECT name FROM user WHERE id IN (?, ?, ?)", ids)

    创建一个RawSeter

    o := orm.NewOrm()
    var r RawSeter
    r = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene")

    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)
    }
    

      

    QueryRow

    QueryRow和QueryRows提供高级sql mapper功能。

    支持struct

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

      

    QueryRows

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

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

      

    SetArgs

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

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

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

      

    Values / ValuesList / ValuesFlat

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

    Values

    以键值对的方式返回结果集

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

    valuesList

    返回结果集slice

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

    ValuesFlat

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

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

      

    RowsToMap

    查询结果匹配到map里

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

      

    RowsToStruct

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

      

    Prepare

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

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

      

  • 相关阅读:
    rest-framework之路由
    rest-framework之频率控制
    mysql 模糊查询 concat()
    解决spring使用动态代理
    MySQL巧用sum,case...when...优化统计查询
    解决maven项目中有小红叉的问题
    google ---gson字符串数组用GSON解析然后用逗号隔开拼接,去掉最后一个逗号
    Elicpse使用技巧-打开选中文件文件夹或者包的当前目录
    powdesigner建表
    遍历map
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/10125588.html
Copyright © 2011-2022 走看看