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.md7: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