道者编程


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


最新评论:
我要评论:

看不清楚


道知

about me

身体是革命的本钱,健身,养生,运动,公众号都有!

链接