您的位置:首页 > 编程语言 > Go语言

GOLANG WEB框架 ORM笔记

2017-07-27 10:44 267 查看
环境:

golang 1.8

beego 1.9

1.生成项目

使用bee命令 bee api myproject

亦可直接指定数据库和表,

 bee api myproject -table="table1,table2" -driver=mysql -conn="root:password@tcp(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:%s@tcp(%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 astaxie@gmail.com
// @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{})
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: