var O orm.Ormer
func init() {
//获取配置参数
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")
if dbport == "" {
dbport = "3306"
}
//mysql数据库注册
_ = orm.RegisterDriver("mysql", orm.DRMySQL)
_ = orm.RegisterDataBase("default", "mysql", dbuser+":"+dbpassword+"@tcp("+dbhost+":"+dbport+")/"+dbname)
//同步结构体和数据库的表之间的关系
orm.RegisterModel(new(Student))
//实现全局的Ormer
O = orm.NewOrm()
// 开启 orm 调试模式:开发过程中建议打开,release时需要关闭
orm.Debug = true
// 自动建表 连接的数据库 是否强制更新(如果强制更新,每次重新启动会删除之前的数据,创建别 ) 更新
orm.RunSyncdb("default", false, true)
}
例如:我之前是干java的,spring、springboot中都将这数据库的可变参数,参数写入配置文件当中,方便部署时的修改。
//该使用该方法配置,访问接口返回固定的内容进行解析。
//router 中的init初始化方法
func init() {
//1、基础路由配置
beego.Get("/goindex", func(ctx *context.Context) {
ctx.Output.Body([]byte("<h1>welcome to index page</h1>"))
})
}
//router 中的init初始化方法,注册路由
func init(){
//固定路由配置 也就是RESTful Controller 路由
beego.Router("/", &controllers.MainController{})
beego.Router("/user",&controllers.UserController{})
}
//MainController中的具体实现
type MainController struct {
beego.Controller
}
func (c *MainController) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "astaxie@gmail.com"
c.TplName = "index.tpl"
}
//UserController中的具体实现
type UserController struct{
beego.Controller
}
func (this *UserController) Get(){
username:=this.GetString("username")
this.Ctx.WriteString(username)
//this.Ctx.Output.Body([]byte(username))
}
func (this *UserController) Post(){
u:=models.User{}
if err:=this.ParseForm(&u);err!=nil{
logs.Info("insert user failure =%s",u)
return
}
logs.Info("user = %s",u)
/**
数据处理逻辑
*/
}
//router中的init添加路由
beego.Router("/stu",&controllers.StudentController{},"get:GoListStu")
//controller 中的实现
func (this *StudentController) GoListStu(){
this.TplName="student/addStu.html"
}
//该方法通过配置路由的方法来实现,请求指定的内容
//使用第三个参数,第三个参数就是用来设置对应 method 到函数名,定义如下
//1、表示任意的 method 都执行该函数
//2、使用 httpmethod:funcname 格式来展示
//3、多个不同的格式使用 ; 分割
//4、多个 method 对应同一个 funcname,method 之间通过 , 来分割
//正则路由 router init 注册
beego.Router("/student/:stuname:string",&controllers.StudentController{})
//controller中实现
func (this *StudentController) Get(){
username:=this.Ctx.Input.Param(":stuname")
this.Ctx.WriteString(username)
}
//根据请求的方式的匹配获取对应的值
//详情参考 beego 框架文档
// https://beego.me/docs/mvc/controller/router.md
//router init注册路由
//其中重要的注解的参数为 router / 和 对应的方法
//example // @router / [get]
ns :=
beego.NewNamespace("/v1",
beego.NSNamespace("/teacher",
beego.NSInclude(
&controllers.TeacherController{},
),
),
beego.NSNamespace("/student",
beego.NSInclude(
&controllers.StudentController{},
),
),
beego.NSNamespace("/user",
beego.NSInclude(
&controllers.UserController{},
),
),
)
beego.AddNamespace(ns)
//controller中的实现
// @router /goAddStu [get]
func (this *StudentController) GoAddStu(){
this.TplName="student/addStu.html"
}
// @router /listStu [get]
func (this *StudentController) ListStu() {
stu := new(models.Student)
listStu:=stu.GetAll()
for i:=0;i< len(listStu);i++ {
logs.Info("%d %s %s ",listStu[i].StuId,listStu[i].StuName,listStu[i].StuSex)
}
this.Data["listStu"]=listStu
this.TplName="student/listStu.html"
}
//在controller中的@router 该行并非注释,而是设置路由路径和请求方式
//router init 中实现路由注册
beego.Include(&controllers.StudentController{})
//controller 中添加到路由表
func (this *StudentController) URLMapping(){
this.Mapping("GolistStu",this.GolistStu2)
}
// @router /goListStu [get]
func (this *StudentController) GolistStu2(){
this.TplName="student/listStu.html"
}
//该种实现中@router 表示路由信息
//router init注册
beego.AutoRouter(&controllers.StudentController{})
//controller 中实现
func (this *StudentController) ZidingRouter(){
this.TplName="student/listStu.html"
}
//访问路径自动注册路由
http://127.0.0.1:8000/Student/ZidingRouter
/Object/Login 调用 ObjectController 中的 Login 方法
/Object/Logout 调用 ObjectController 中的 Logout 方法
当 Field 类型为 int, int32, int64, uint, uint32, uint64 时,可以设置字段为自增健
当模型定义里没有主键时,符合上述类型且名称为 Id 的 Field 将被视为自增健。
鉴于 go 目前的设计,即使使用了 uint64,但你也不能存储到他的最大值。依然会作为 int64 处理。
设置为主键,适用于自定义其他类型为主键
数据库表默认为 NOT NULL,设置 null 代表 ALLOW NULL
Name string `orm:"null"`
为单个字段增加索引
为单个字段增加 unique 键
Name string `orm:"unique"`
为字段设置 db 字段的名称
Name string `orm:"column(user_name)"`
string 类型字段默认为 varchar(255)
设置 size 以后,db type 将使用 varchar(size)
Title string `orm:"size(60)"
设置 float32, float64 类型的浮点精度
Money float64 `orm:"digits(12);decimals(4)"`
Created time.Time `orm:"auto_now_add;type(datetime)"`
Updated time.Time `orm:"auto_now;type(datetime)"`
auto_now 每次 model 保存时都会对时间自动更新
auto_now_add 第一次保存时才设置时间
对于批量的 update 此设置是不生效的
设置为 date 时,time.Time 字段的对应 db 类型使用 date
Created time.Time `orm:"auto_now_add;type(date)"`
设置为 datetime 时,time.Time 字段的对应 db 类型使用 datetime
Created time.Time `orm:"auto_now_add;type(datetime)"`
Status int `orm:"default(1)"`
为字段设置默认值,类型必须符合(目前仅用于级联删除时的默认值)
Status int `orm:"default(1)" description:"这是状态字段"`
为字段添加注释
import (
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
)
var log *logs.BeeLogger
func init() {
log = logs.NewLogger()
//输出于控制台
log.SetLogger(logs.AdapterConsole)
//输出到日志文件,configs 的参数该可以继续配置
log.SetLogger("file", `{"filename":"./test.log"}`)
}
在beego 的main.go 中可以按照这种方式实现日志的输出
通过配置文件配置如下:
sessionon = true
通过这种方式就可以开启 session,如何使用 session,请看下面的例子:
func (this *MainController) Get() {
v := this.GetSession("asta")
if v == nil {
this.SetSession("asta", int(1))
this.Data["num"] = 0
} else {
this.SetSession("asta", v.(int)+1)
this.Data["num"] = v.(int)
}
this.TplName = "index.tpl"
}
session 有几个方便的方法:
SetSession(name string, value interface{})
GetSession(name string) interface{}
DelSession(name string)
SessionRegenerateID()
DestroySession()
session 操作主要有设置 session、获取 session、删除 session。
参考文献 beego 官网说明连接 https://beego.me/docs/intro/
作者微信/QQ: 1414100586@qq.com