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
    

      

  • 相关阅读:
    软件工程第一次作业
    邮件服务器的搭建
    将博客搬至CSDN
    古典密码加密解密之多表代换
    Nginx + Tomcat 负载均衡配置详解
    openstack i版搭建教程
    IIS、apache、tomcat服务器虚拟主机配置
    SMTP邮件发送命令
    hadoop集群安装
    信息管理系统(java)
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/10125588.html
Copyright © 2011-2022 走看看