3.原生 SQL 操作
最后更新于:2022-04-02 04:54:35
原生 SQL 查询
~~~
DB := orm.NewOrm() 创建一个数据库链接 Ormer
var ret orm.RawSeter 创建一个 RawSeter
ret = o.Raw("SQl语句")
QueryRow() QueryRow 和 QueryRows 提供高级 sql mapper 功能
QueryRows() QueryRows 支持的对象还有 map 规则是和 QueryRow 一样的,但都是 slice
Values() 返回结果集的 key => value 值
ValuesList() 返回结果集 slice
ValuesFlat() 返回单一字段的平铺 slice 数据
RowsToMap() 查询结果匹配到 map 里
RowsToStruct() 查询结果匹配到 struct 里
Exec() 执行 sql 语句,返回 sql.Result 对象
SetArgs() 改变 Raw(sql, args…) 中的 args 参数,返回一个新的 RawSeter 。用于单条 sql 语句,重复利用,替换参数然后执行。
Prepare() 用于一次 prepare 多次 exec,以提高批量执行的速度。
~~~
~~~
package main
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
// struct 字段,首字母必须大写
type Person struct {
User_id int `orm:"pk"`
Username string
Sex string
Email string
}
func init() {
maxIdle := 30
maxConn := 30
// 创建连接池
err := orm.RegisterDataBase("default", "mysql", "root:root@tcp(127.0.0.1:3306)/test?charset=utf8", maxIdle, maxConn)
if err != nil {
fmt.Println("connect mysql err : ", err)
}
// 需要在init中注册定义的model
orm.RegisterModel(new(Person))
}
func main() {
// 创建一个数据库链接 Ormer
DB := orm.NewOrm()
var r0 orm.RawSeter
// 创建一个 RawSeter
r0 = DB.Raw("select * from person where user_id = ?", 1)
var p1 Person
// QueryRow 执行 sql 语句,返回 err ,查询结果存入 p1
err := r0.QueryRow(&p1)
if err != nil {
fmt.Println("QueryRow err : ", err)
}
fmt.Println(p1)
ids := []int{1, 2, 3}
var p2 []Person
// QueryRows 执行 sql 语句,返回 num,err ,查询结果 slice 存入 p2
num, _ := DB.Raw("select * from person where user_id in (?,?,?)", ids).QueryRows(&p2)
fmt.Println(num)
fmt.Println(p2)
// Values 返回结果集的 key => value 值
var maps []orm.Params
num, err = DB.Raw("select * from person where user_id = ?", 1).Values(&maps)
if err == nil && num > 0 {
fmt.Println(maps)
}
// ValuesList 返回结果集 slice
var lists []orm.ParamsList
num, err = DB.Raw("select * from person where user_id < ?", 3).ValuesList(&lists)
if err == nil && num > 0 {
fmt.Println(lists) // slene
}
// ValuesFlat 返回单一字段的平铺 slice 数据
var list orm.ParamsList
num, err = DB.Raw("select * from person where user_id < ?", 3).ValuesFlat(&list)
if err == nil && num > 0 {
fmt.Println(list) // []{"1","2","3",...}
}
// RowsToMap 查询结果匹配到 map 里
res := make(orm.Params)
num, err = DB.Raw("select * from person where user_id < ?", 3).RowsToMap(&res, "username", "email")
if err == nil && num > 0 {
fmt.Println("RowsToMap", res)
}
// RowsToStruct 查询结果匹配到 struct 里
type Email struct {
Person0 string
Person1 string
}
res1 := new(Email)
num, err = DB.Raw("select username,email from person where user_id < ?", 3).RowsToStruct(res1, "username", "email")
if err == nil && num > 0 {
fmt.Println(err, num)
fmt.Println("RowsToStruct", res1)
}
// Exec() 执行 sql 语句,返回 sql.Result 对象
act := DB.Raw("UPDATE person SET username = ? where user_id = ?", "your", 1)
res2, err := act.Exec()
if err == nil {
num, _ := res2.RowsAffected()
fmt.Println("mysql row affected nums: ", num)
}
// SetArgs() 用于单条 sql 语句,重复利用,替换参数然后执行。
res3, err := act.SetArgs("your2", 2).Exec()
if err == nil {
num, _ := res3.RowsAffected()
fmt.Println("mysql row affected nums: ", num)
}
// Prepare() 用于一次 prepare 多次 exec,以提高批量执行的速度。
p, err := DB.Raw("UPDATE person SET username = ? WHERE user_id = ?").Prepare()
_, _ = p.Exec("testing", 3)
_, _ = p.Exec("testing", 4)
p.Close() // 别忘记关闭 statement
}
~~~
';