beego(二)配置mysql和使用
1:先把mysql驱动搞下来
go get github.com/go-sql-driver/mysql现在github.com下就有mysql驱动了
2:导入相关包,我这里把配置加到入口文件,main.go
import ( _ "message/routers" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" // 导入orm包 _ "github.com/go-sql-driver/mysql" //导入mysql驱动 )
3:配置数据库参数
修改app.conf配置文件
appname = message //项目名称 httpport = 93 //http端口 runmode = dev [dev] dbhost = "127.0.0.1" dbport = "3306" dbuser = "root" dbpassword = "123" dbname = "siecomstudy" dbchar = "utf8" dbprefix = "js_"以上参数最低级的菜鸟都看的懂,不作说明。
4:然后是链接数据库,我这里写在beego的入口文件main.go中,这里我创建一个init方法
package main import ( _ "message/routers" "github.com/astaxie/beego" "github.com/astaxie/beego/orm" // 导入orm包 _ "github.com/go-sql-driver/mysql" //导入mysql驱动 ) /* 为什么用init函数? go语言中,main函数执行前会先完成它引入包的init函数,依次类推。最终等main函数自己得init函数执行完之后再执行main函数 init函数不需要传入参数,也不会返回任何值。与main相比而言,init没有被声明,因此也不能被引用。 init的优先级比 main还高 */ func init(){ //这些数据是从app.conf中获取过来的 dbhost := beego.AppConfig.String("dbhost") dbport := beego.AppConfig.String("dbport") dbuser := beego.AppConfig.String("dbuser") dbpassword := beego.AppConfig.String("dbpassword") dbname := beego.AppConfig.String("dbname") dbchar := beego.AppConfig.String("dbchar") // 注册数据库驱动,Mysql Sqlite,Postgres三种框架已经注册过,所以可以不写 // orm.RegisterDriver("mysql", orm.DRMySQL) /* 注册一个数据库别名:default,默认使用,必须填写,其实就是常说的数据库链接 我这里数据库名称是blog,default就是blog的别名 loc=Local:设置时区;驱动默认可能使用UTC时间,UTC:世界时间,不属于任意时区,和我们东八区相差8个小时。 beego建议:loc=Asia%2FShanghai这样设置,但是这样mysql有的版本不支持,比如5.5,mysql建议设置local。 通过设置loc=local,orm在使用time.Time类型时,就会获取当前mysql所在服务器的时间,这样时间就不会出错。 */ orm.RegisterDataBase("default", "mysql", dbuser+":"+dbpassword+"@tcp("+dbhost+":"+dbport+")/"+dbname+"?charset="+dbchar+"&loc=Local") orm.SetMaxIdleConns("default", 30) //最大空闲连接数,可以不写 orm.SetMaxOpenConns("default", 100) //最大连接数,可以不写 /* 如果要使用ORM面向数据模型方式,必须注册模型:orm.RegisterModel(new(User)) User模型 还有一种可以选择Raw,其实就是原生sql拼接,或者构造器方式,无需注册模型 */ } func main() { beego.Run() }
5:CURD操作,这里用Raw方式,原生sql
官方文档:https://beego.me/docs/mvc/model/rawsql.md
这种方式使用很少,适合一些特别复杂的SQL
6:查询构造器方式,beego对原生sql的封装,使用起来更方面,相比ORM性能更好,也更简单。
package controllers import ( "github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql" "fmt" ) type MainController struct { BaseController } type Img struct{ Id int Name string Title string } //首页 func (c *MainController) Get() { var imgs []Img qb, _:= orm.NewQueryBuilder("mysql") //创建查询生成器 qb.Select("id","name","title").From("js_img") //SELECT id,name,title From js_img sql := qb.String() // 导出 SQL 语句 o := orm.NewOrm() //新建 ormer 对象 _ , err := o.Raw(sql).QueryRows(&imgs) //返回影响的数目和异常信息 if( err != nil ) { c.Ctx.WriteString(fmt.Sprintf("%s",err)) //处理异常 } }官方文档:https://beego.me/docs/mvc/model/querybuilder.md
7:ORM方式:
官方是单页面演示的ORM,这里我们用MVC模式搞一下:
这是我的项目目录
第一步:我们在models目录下新建一个模型文件:goods.go
package models import ( "github.com/astaxie/beego" "github.com/astaxie/beego/orm" //引入beego的orm _ "github.com/go-sql-driver/mysql" //引入beego的mysql驱动 "fmt" ) //结构体 type Goods struct{ Goods_id int `orm:"auto"` //主键 必须 Category_id int Title string Content string Column int Times int Log string } func init(){ orm.RegisterModel(new(Goods)) //注册模型 } //表名 func (m *Goods) TableName() string { //dbprefix是在app.conf下设置的表前缀 return fmt.Sprintf("%s%s", beego.AppConfig.String("dbprefix"), "goods") } // 传入表名,返回一个 QuerySeter 对象,然后就可以组织高级查询了,如下地址 // https://beego.me/docs/mvc/model/query.md func (m *Goods) Query() orm.QuerySeter { return orm.NewOrm().QueryTable(m) }
第二步:我们在某个控制器调取这个模型
package controllers import ( "fmt" "message/models" //载入模型 message是我们的项目名称,可以在app.conf中查看appname ) //我在这个方法中调取模型 func (this *NewsController) Get() { var list []*models.Goods //定义一个指针数组 list, models.Goods为类型 goodsTable := new(models.Goods) //实例化对象作为表名 query := goodsTable.Query() //调用Goods模型中的方法Query返回查询集程序 //然后就可以使用高级查询了 count ,_ := goodsTable.Query().All(&list) //比如这里我使用ALL方法。 fmt.Println(count) //控制台输出总数 // count是查询获取到的总数,查询数据在list 这个指针数组中 }我们在控制器没有加载orm和mysql驱动进来,在模型做一个简单的封装,实例化模型对象以后,就可以在控制器中操作。https://beego.me/docs/mvc/model/query.md