欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GOLANG WEB框架 ORM笔记

程序员文章站 2022-07-03 23:18:59
...

环境:

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{})
}