GOLANG WEB框架 ORM笔记

环境:

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 [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,Go)