beego数据库基本操作实践

本文详述了beego框架中对数据库的多种操作,包括QueryTable、Raw SQL、事务处理和关系查询等。介绍了如何进行数据读取、更新、删除和插入,以及如何处理一对一和多对一的关系。还探讨了使用QueryBuilder构造复杂查询的方法,适用于不常用ORM的开发者。
摘要由CSDN通过智能技术生成

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
...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值