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 } ~~~
';