本文介绍了Beego框架对Mysql关系数据库的支持方法,并将在项目中遇到的一些问题及解决办法进行简单总结。
Beego是个啥
Beego 是一个快速开发Go应用的HTTP框架,它可以用来快速开发API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个框架,详见Beego官网。
Beego架构
不废话,请右转到Beego官网
Beego支持的数据库
笔者使用的Beego版本为1.4.3,官方介绍已支持的数据库有Mysql、PostgreSQL、Sqlite3,这里结合官网描述及在项目中使用Mysql的方式进行简单小结。
安装Beego ORM
go get github.com/astaxie/beego/orm
注:这里要求go语言的运行环境已经安装成功。
利用orm进行CRUD操作
引入driver
在使用orm时,需要在import 中引入orm包及mysql包,形如:
import (
"github.com/astaxie/beego“
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
)
设置并注册信息
dbUser := Cfg.String("db_user")
dbPwd := Cfg.String("db_passowrd")
dbHost := Cfg.String("db_host")
dbPort := Cfg.String("db_port")
dbName := Cfg.String("db_name")
maxIdleConn, _ := Cfg.Int("db_max_idle_conn")
maxActiveConn, _ := Cfg.Int("db_max_open_conn")
dbUrl := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8", dbUser, dbPwd, dbHost, dbPort, dbName) +
"&loc=" + url.QueryEscape("Asia/shanghai")
orm.RegisterDriver("mysql", orm.DR_MySQL)
orm.RegisterDataBase("default", "mysql", dbUrl, maxIdleConn, maxActiveConn)
#Cfg为beego.AppConfig变量
单一对象的CRUD操作
(1)定义一个结构体
type UserInfo struct {
//beego默认将其转为user_info表,也可根据实际情况改变,参看[模型定义](http://beego.me/docs/mvc/model/models.md)
Id int `orm:"pk:auto"` //主键自增
Name string
...
TS time.Time
}
//可以定义索引
func (u *UserInfo) TableIndex() [][]string {
return [][]string{
[]string{"Name"},
}
}
//注册模型
orm.RegisterModel(new(UserInfo))
//一般在初始化init方法中注册
(2)新增(创建C)操作
//RunSyncdb(name,force,verbose)功能:建表。
//name为数据库别名,且default不能换;force为是否强制建数据库;verbose是否打印建表过程
orm.RunSyncdb("default", false, true)
o := orm.NewOrm()
u := new(UserInfo)
UserInfo.Name = "xialingsc"
idInt64,err := o.Insert(UserInfo)
...
(3)查询(读取R)操作
一般应用中R操作分为获取列表和单个对象两种
a.获取列表
o := orm.NewOrm()
var userList []*UserInfo
这里使用了一个Filter进行了过滤,实际使用中可根据情况决定使用与否
_, err := o.QueryTable(new(UserInfo)).Filter("Name", d.GetSession("uid").(string)).All(&userList)
b.获取单个对象
o := orm.NewOrm()
user := new(UserInfo)
user.Name = "xialingsc"
o.Read(user)
(4)更新U操作
o := orm.NewOrm()
user := new(UserInfo)
user.Name = "xialingsc"
...//更多具体内容
o.Update(user)
(5)删除D操作
o := orm.NewOrm()
user := new(User)
user.Name = "xialingsc"
o.Delete(user)
Html Template中条件循环使用
这里主要介绍golang在Html模板中的使用,下面均采用了实际代码,某些可能涉及到了本文未提及知识点。查看官网请戳这里
条件
{{if eq "" .Container.Config.Domainname}}
无
{{else}}
{{.Container.Config.Domainname}}
{{end}}
单层循环
{{range .DeployList}}
<tr>
<td><input type="radio" value="{{.Id}}" name="template"></td>
<td style="text-align:left">
<a href="javascript:inspect('{{.ContainerId}}')">{{substr .ContainerId 0 20}}...</a></td>
<td>{{.Name}} </td>
<td>{{.Dtype | DeployTypeValueTansferToChinese}} </td>
<td style="text-align:left">{{.Description}}</td>
<td>{{.Time | TimeToDateStr}}</td>
<td>{{.User}}</td>
</tr>
{{end}}
多层循环
取顶层变量时,需要加$
{{range .Category}}
<tr>
<th>{{.Id}}</th>
<th>{{.Title}}</th>
{{range $.ArticleZX}}
<th>{{.Title}}</th>
{{range $.ArticleNews}}
<th><a href="/detail?id={{.Id}}">{{.Title}}</a></th>
{{end}}
{{end}}
</tr>
{{end}}
循环中增加条件
{{$legth := len .Container.Config.Env }}
{{if gt $legth 3}}
{{range $index,$element := .Container.Config.Env}}
{{if eq $element "type=service"}}
{{else if eq $element "type=unique"}}
{{else}}
{{$element}}
{{end}}
{{end}}
{{else}}
无
{{end}}
等价写法
{{range $index,$element := .Container.Config.Env}}
{{if eq $index 0}}
{{if eq $element "type=service"}}
服务型
{{else}}
独立型
{{end}}
{{end}}
{{end}}
等价于
{{ $type := index .Container.Config.Env 2}}
{{if eq $type "type=service"}}
服务型
{{else}}
独立型
{{end}}
注意事项
在将Go与Mysql进行结合运用的过程中,有一些细节需要注意,比如时间类型处置等问题。
(1)时间类型处置
当你在mysql中设置某字段类型为时间戳timestamp时,在Go语言中如何处理才能存入到该字段呢?我们既可以采用mysql在变动时自动加上时间戳的机制,还可以在go程序中利用time.Now()进行赋值。但问题的重点在于,我们取出时间在页面进行显示的时候,就傻眼了,明明是按’0000-00-00 00:00:00’格式的,结果变为了’0000-00-00 00:00:00 +0000 UTC’格式,如何处理呢?这里就必须利用特殊字符串对其进行格式化,类似为time.Now().Format(“2006-01-02 15:04:05”),特殊字符串必须为”2006-01-02 15:04:05”,必须为”2006-01-02 15:04:05”,必须为”2006-01-02 15:04:05”,重要的事就得多说几遍。那些golang大贤们也老牛了,用诞生日作牛串。
(2)一对一、一对多、多对多的处理
简单的使用方法就介绍到这里,还有更多具体应用,就需要自己去多探索和实践了。