beego数据库基本操作实践
标签:beego 数据库 实践
beego中对数据库的操作比较多,本文主要实践除了orm以外的几种对数据库的访问方式。而且实际上,如果你经常使用数据库而不怎么用orm的话,直接使用下面的方法比除了CURD四种情况外使用orm要方便很多。
其实原始的中文文档讲的就很清除,这里只是做一个自己看的总结而已,这样我查东西的时候就不用忍受抽风的延迟了。
主要包括三个:直接用Raw函数,使用Exec执行SQL指令与事务提交。一般而言orm就不要直接用SQL了,不然和直接使用SQL驱动有什么区别。
文章目录
QueryTable
传入表名,或model对象,返回一个QuerySeter。ORM以QuerySeter来组织查询,每个返回QuerySeter的方法都会获得一个新的QuerySeter对象。
o := orm.NewOrm()
// 获取 QuerySeter 对象,user 为表名
qs := o.QueryTable("user")
// 也可以直接使用对象作为表名
user := new(User)
qs = o.QueryTable(user) // 返回 QuerySeter
这里是高级查询的具体实现部分。
下面是一段例子,及其简单的测试了一下QueryTable的具体使用方法
package main
import (
"fmt"
_ "apiproject/routers"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
"github.com/astaxie/beego"
)
type Test struct {
Id int
Name string `orm:"size(100)"`
}
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "wty:97112500@tcp(127.0.0.1:3306)/test?charset=utf8")
orm.RegisterModel(new(Test))
orm.RunSyncdb("default", false, true)
}
func main() {
o := orm.NewOrm()
test := Test{Name:"test2"}
//insert
id, err := o.Insert(&test)
fmt.Printf("ID:%d, ERR:%v\n",id,err)
qs := o.QueryTable("test")
qs.Filter("Name","test2")
var users []*Test
num,err := o.QueryTable("test").Filter("Name","test2").All(&users)
fmt.Println("Returned Rows Num:",num,err)
for i:=int64(0) ; i<num ; i++{
fmt.Println(users[i].Id)
}
if beego.BConfig.RunMode == "dev" {
beego.BConfig.WebConfig.DirectoryIndex = true
beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
}
beego.Run()
}
这个例子会返回表test中所有名字为test2的对象到Tset数组users中,并打印它们的id
总结
接口实现
前排提醒,所有的QuerySeter的方法都会返回一个新的QuerySeter对象,因此可以自由的使用链式方法(应该是叫这个名字)
读取
QuerySeter可以使用Filter方法,接受参数并进行数组上的判断。多个Filter之间使用And进行连接。
Filter方法的第一个参数为描述字段的名称与sql操作符的符合,第二个参数为具体的值。
此外还有用来排除的Exclude,自定义的条件表达式SetCond,聚类GroupBy,参数使用expr是用的排序表示OrderBy,对应sql重复的Distinct,参数使用expr是使用的关系查询RelatedSel,返回结果行数Count
限制最大行数的Limit方法与设置偏移行数的Offset方法。
更新
甚至还有依据当前查询条件进行批量更新操作
num, err := o.QueryTable("user").Filter("name", "slene").Update(orm.Params{
"name": "astaxie",
})
fmt.Printf("Affected Num: %s, %s", num, err)
// SET name = "astaixe" WHERE name = "slene"
以及原子操作增加字段值
// 假设 user struct 里有一个 nums int 字段
num, err := o.QueryTable("user").Update(orm.Params{
"nums": orm.ColValue(orm.ColAdd, 100),
})
// SET nums = nums + 100
删除
num, err := o.QueryTable("user").Filter("name", "slene").Delete()
fmt.Printf("Affected Num: %s, %s", num, err)
// DELETE FROM user WHERE name = "slene"
插入
用一次prepare多次insert插入,以提高批量插入的速度。具体速度还没有测试,感觉应该会挺快的。
var users []*User
...