GOLANG WEB框架 ORM笔记
环境:
golang 1.8
beego 1.9
1.生成项目
使用bee命令 bee api myproject
亦可直接指定数据库和表,
bee api myproject -table="table1,table2" -driver=mysql -conn="root:[email protected](127.0.0.1:3306)/testdb"
如果这样做,直接会在 init()里注册orm数据库,并且连接字符窜直接写死,每个table会生成一个 model和controller,并且路由会很长很乱很烦,所以还是自已定制比较好,除项目名外不带其他参数:
默认会生成 两个按制器 和相应的两个模型,分别是:
myproject/controllers/object.go 和 myproject/controllers/user.go 及相应的 models下的 object.go和user.go
如果没有相应的表和功能,可以直接删除这四个文件.
2. 修改项目
首先从配置文件开始:
myproject/conf/app.conf
清除原来的内容,重新改写成:
appname = myproject
httpport = 8080
runmode = dev
autorender = false
copyrequestbody = true
EnableDocs = true
[dev]
db_type = "mysql"
db_user = "root"
db_password = "123456"
db_host = "127.0.0.1"
db_port = 3306
db_database = "testdb"
[prod]
db_type = "mysql"
db_user = "root"
db_password = "prodpassword"
db_host = "mydbserver.mydomain.com"
db_port = 3306
db_database = "testdb"
修改main.go中的init()函数
func init() {
dbtype := beego.AppConfig.String("db_type")
dbuser:= beego.AppConfig.String("db_user")
dbPassword := beego.AppConfig.String("db_password")
dbhost := beego.AppConfig.String("db_host")
dbase := beego.AppConfig.String("db_database")
dbport,err := beego.AppConfig.Int("db_port")
if err !=nil {
dbport = 3306
}
switch dbtype{
case "mysql":
datasource:=fmt.Sprintf("%s:%[email protected](%s:%d)/%s",dbuser,dbPassword,dbhost,dbport,dbase)
orm.RegisterDataBase("default",dbtype,datasource)
}
}
3.手动添加model
之前生成项目时会自动生成 user和object的model,先删除了,然后在models目录下新建mytest目录,假设数据库里有表 mytable1,则在此目录下新建mytable1.go
myproject/models/mytest/mytable1.go:
package mytest
import (
"github.com/astaxie/beego/orm"
"reflect"
)
type Mytable1 struct {
Id string `orm:"column(id);pk"`
TName string `orm:"column(t_name);size(50)"`
TLastUpdate uint64 `orm:"column(t_lastUpdate);null"`
TBody string `orm:"column(TBody);size(50);null"`
}
func (t *Mytable1) TableName() string {
return "mytable1"
}
func init(){
orm.RegisterModel(new(Mytable1))
}
func GetInfoNotNull() (ml []interface{},err error){
o:=orm.NewOrm()
qs:=o.QueryTable(new(Mytable1))
var l []Mytable1
_,err= qs.Filter("TBody__isnull",true).All(&l,
"Id", "TName", "TLastUpdate", "TBody")
if err ==nil{
for _,v:=range l {
m:=make(map[string]interface{})
val:=reflect.ValueOf(v)
m["Id"]=val.FieldByName("Id").Interface()
m["TName"]=val.FieldByName("TName").Interface()
m["TLastUpdate"]=val.FieldByName("TLastUpdate").Interface()
m["TBody"]=val.FieldByName("TBody").Interface()
ml = append(ml,m)
}
return ml,nil
}else{
return nil,err
}
}
这一部份是beego ORM的最主要部份,对像印射都在这里
相应的在controllers目录下新建mytable1的控制器,如果使用自动路由,所取的名字将影响到URL路径
myproject/controllers/mytable1.go:
package controllers
import (
"github.com/astaxie/beego"
"myproject/models/mytable1"
"myproject/utils"
)
type mytable1Controller struct {
beego.Controller
}
// API:GetInfoNotNull
// URL:http://127.0.0.1/myaction/GetInfoNotNull
// Method: GET
func (c *InfoController)GetInfoNotNull(){
l,err := myaction.GetInfoNotNull()
if err != nil{
c.Data["json"] = err.Error()
}else{
c.Data["json"] =utils.AjaxJson(l,"Success",len(l),utils.STATUS_SUCCESS)//c.Data["json"] = l
}
c.ServeJSON()
}
utiles.AjaxJson()只是我自已写的常量定义和JSON封装,使response显示好看一点,并没什么用.可以直接c.Data["json"]=l最后,把此控制器添加到路由中:
在init中注释掉原来两个自动生成的路由,添加一个自动路由,
// @APIVersion 1.0.0
// @Title beego Test API
// @Description beego has a very cool tools to autogenerate documents for your API
// @Contact [email protected]
// @TermsOfServiceUrl http://beego.me/
// @License Apache 2.0
// @LicenseUrl http://www.apache.org/licenses/LICENSE-2.0.html
package routers
import (
"myproject/controllers"
"github.com/astaxie/beego"
)
func init() {
//ns := beego.NewNamespace("/v1",
// beego.NSNamespace("/object",
// beego.NSInclude(
// &controllers.ObjectController{},
// ),
// ),
// beego.NSNamespace("/user",
// beego.NSInclude(
// &controllers.UserController{},
// ),
// ),
//)
//beego.AddNamespace(ns)
beego.AutoRouter(&controllers.mytable1Controller{})
}
下一篇: golang echo框架安装历程
推荐阅读
-
使用Python的web.py框架实现类似Django的ORM查询的教程
-
我的第一个python web开发框架(28)——定制ORM(五)
-
Python ORM框架SQLAlchemy学习笔记之数据查询实例
-
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
-
Python ORM框架SQLAlchemy学习笔记之关系映射实例
-
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
-
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
-
python web框架学习笔记
-
我的第一个python web开发框架(31)——定制ORM(八)
-
我的第一个python web开发框架(25)——定制ORM(一)