文档章节

一个Beego的orm问题

SunnyGo
 SunnyGo
发布于 2016/06/01 09:24
字数 1125
阅读 314
收藏 0

我使用bee -api生成了orm。但是在执行GetAllXXX的时候遇到了问题

数据库如下:

DROP TABLE IF EXISTS `sunny_navigation`;
CREATE TABLE `sunny_navigation` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `level` int(11) NOT NULL COMMENT '级别',
  `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '父ID',
  `module` char(32) DEFAULT NULL COMMENT '那个方法',
  `action` char(32) DEFAULT NULL COMMENT '那个module',
  `name` char(32) NOT NULL COMMENT '显示名称',
  `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序,越小越靠前',
  `display` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否显示',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of aqi_navigation
-- ----------------------------

INSERT INTO `sunny_navigation` VALUES ('1', '0', '0', '', '', '系统管理', '110',  '1');
INSERT INTO `sunny_navigation` VALUES ('2', '1', '1', 'editor', 'page', '用户管理', '0','1');
INSERT INTO `sunny_navigation` VALUES ('3', '1', '1', 'Usergroup', 'page', '用户组管理', '0', '1');
INSERT INTO `sunny_navigation` VALUES ('4', '1', '1', 'power', 'page', '权限管理', '0',  '1');
INSERT INTO `sunny_navigation` VALUES ('5', '1', '1', 'navigation', 'page', '菜单管理', '0',  '1');

生成的model是

package models

import (
	"errors"
	"fmt"
	"reflect"
	"strings"

	"github.com/astaxie/beego/orm"
)

type SunnyNavigation struct {
	Id       int    `orm:"column(id);auto"`
	Level    int    `orm:"column(level)"`
	ParentId int    `orm:"column(parent_id)"`
	Module   string `orm:"column(module);size(32);null"`
	Action   string `orm:"column(action);size(32);null"`
	Name     string `orm:"column(name);size(32)"`
	Sort     int    `orm:"column(sort)"`
	Display  int8   `orm:"column(display)"`
}

生成的原生的controller的代码如下:

// @Title Get All
// @Description get SunnyNavigation
// @Param	query	query	string	false	"Filter. e.g. col1:v1,col2:v2 ..."
// @Param	fields	query	string	false	"Fields returned. e.g. col1,col2 ..."
// @Param	sortby	query	string	false	"Sorted-by fields. e.g. col1,col2 ..."
// @Param	order	query	string	false	"Order corresponding to each sortby field, if single value, apply to all sortby fields. e.g. desc,asc ..."
// @Param	limit	query	string	false	"Limit the size of result set. Must be an integer"
// @Param	offset	query	string	false	"Start position of result set. Must be an integer"
// @Success 200 {object} models.SunnyNavigation
// @Failure 403
// @router / [get]
func (c *SunnyNavigationController) GetAll() {
	var fields []string
	var sortby []string
	var order []string
	var query map[string]string = make(map[string]string)
	var limit int64 = 10
	var offset int64 = 0

	// fields: col1,col2,entity.col3
	if v := c.GetString("fields"); v != "" {
		fields = strings.Split(v, ",")
	}
	// limit: 10 (default is 10)
	if v, err := c.GetInt64("limit"); err == nil {
		limit = v
	}
	// offset: 0 (default is 0)
	if v, err := c.GetInt64("offset"); err == nil {
		offset = v
	}
	// sortby: col1,col2
	if v := c.GetString("sortby"); v != "" {
		sortby = strings.Split(v, ",")
	}
	// order: desc,asc
	if v := c.GetString("order"); v != "" {
		order = strings.Split(v, ",")
	}
	// query: k:v,k:v
	if v := c.GetString("query"); v != "" {
		for _, cond := range strings.Split(v, ",") {
			kv := strings.Split(cond, ":")
			if len(kv) != 2 {
				c.Data["json"] = errors.New("Error: invalid query key/value pair")
				c.ServeJSON()
				return
			}
			k, v := kv[0], kv[1]
			query[k] = v
		}
	}

	l, err := models.GetAllSunnyNavigation(query, fields, sortby, order, offset, limit)
	if err != nil {
		c.Data["json"] = err.Error()
	} else {
		c.Data["json"] = l
	}
	c.ServeJSON()
}

我模仿着这个函数写的函数如下:

func (this *IndexController) GetAllNagigation() {
	var fields []string
	var sortby []string
	var order []string
	var query map[string]string = make(map[string]string)
	var limit int64 = 0 //if Limit <= 0 then Limit will be set to default limit ,eg 1000
	var offset int64 = 0
	v := "display:1"
	for _, cond := range strings.Split(v, ",") {
		kv := strings.Split(cond, ":")
		if len(kv) != 2 {
			this.Data["json"] = errors.New("Error: invalid query key/value pair")
			this.ServeJSON()
			return
		}
		k, v := kv[0], kv[1]
		query[k] = v
	}
	//id,parent_id,module,action,name
	fields = strings.Split("id,parent_id,module,action,name", ",")
	//level asc,parent_id asc,sort asc,id asc
	sortby = strings.Split("level,parent_id,sort,id", ",")
	order = strings.Split("asc,asc,asc,asc", ",")
	this.Info(order)
	l, err := models.GetAllSunnyNavigation(query, fields, sortby, order, offset, limit)
	if err != nil {
		this.Data["json"] = err.Error()
	} else {
		this.Data["json"] = l
	}
	this.ServeJSON()
}

120行错误是

m[fname] = val.FieldByName(fname).Interface()

我在models生成的代码里面加了打印:

// GetAllSunnyNavigation retrieves all SunnyNavigation matches certain condition. Returns empty list if
// no records exist
func GetAllSunnyNavigation(query map[string]string, fields []string, sortby []string, order []string,
	offset int64, limit int64) (ml []interface{}, err error) {
	o := orm.NewOrm()
	qs := o.QueryTable(new(SunnyNavigation))
	// query k=v
	for k, v := range query {
		// rewrite dot-notation to Object__Attribute
		k = strings.Replace(k, ".", "__", -1)
		qs = qs.Filter(k, v)
	}
	// order by:
	var sortFields []string
	if len(sortby) != 0 {
		if len(sortby) == len(order) {
			// 1) for each sort field, there is an associated order
			for i, v := range sortby {
				orderby := ""
				if order[i] == "desc" {
					orderby = "-" + v
				} else if order[i] == "asc" {
					orderby = v
				} else {
					return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
				}
				sortFields = append(sortFields, orderby)
			}
			qs = qs.OrderBy(sortFields...)
		} else if len(sortby) != len(order) && len(order) == 1 {
			// 2) there is exactly one order, all the sorted fields will be sorted by this order
			for _, v := range sortby {
				orderby := ""
				if order[0] == "desc" {
					orderby = "-" + v
				} else if order[0] == "asc" {
					orderby = v
				} else {
					return nil, errors.New("Error: Invalid order. Must be either [asc|desc]")
				}
				sortFields = append(sortFields, orderby)
			}
		} else if len(sortby) != len(order) && len(order) != 1 {
			return nil, errors.New("Error: 'sortby', 'order' sizes mismatch or 'order' size is not 1")
		}
	} else {
		if len(order) != 0 {
			return nil, errors.New("Error: unused 'order' fields")
		}
	}

	var l []SunnyNavigation
	qs = qs.OrderBy(sortFields...)
	if _, err := qs.Limit(limit, offset).All(&l, fields...); err == nil {
		if len(fields) == 0 {
			for _, v := range l {
				ml = append(ml, v)
			}
		} else {
			// trim unused fields
			fmt.Println(l)
			for _, v := range l {
				m := make(map[string]interface{})
				val := reflect.ValueOf(v)
				fmt.Println(fields)
				fmt.Println(order)
				fmt.Println(v)
				for _, fname := range fields {
					fmt.Println(val)
					fmt.Println(fname)
					m[fname] = val.FieldByName(fname).Interface()
				}
				ml = append(ml, m)
			}
		}
		return ml, nil
	}
	return nil, err
}

我猜测的原因是这样的

m[fname] = val.FieldByName(fname).Interface()

这句话出错了,val 和v的值都是{1 0 0   系统管理 0 0},原始的生成的代码是不是认为生成的是key:value格式的?

 

在”傅小黑“大神的帮助下,我知道了原因,原因是fields的名称必须是orm生成的名称,而不能是数据库里面原来的名字。代码修改如下:

//id,parent_id,module,action,name
	fields = strings.Split("Id,ParentId,Module,Action,Name", ",")

 

© 著作权归作者所有

共有 人打赏支持
SunnyGo
粉丝 7
博文 28
码字总数 8249
作品 0
东城
技术主管
私信 提问
加载中

评论(2)

SunnyGo
SunnyGo

引用来自“Hazy”的评论

请问生成的model代码里
func GetAllSunnyNavigation(query map[string]string, fields []string, sortby []string, order []string,offset int64, limit int64) (ml []interface{}, err error) {…………}
这个方法,参数怎么填才能调用成功啊
现在这个参数就可以成功
Hazy
Hazy
请问生成的model代码里
func GetAllSunnyNavigation(query map[string]string, fields []string, sortby []string, order []string,offset int64, limit int64) (ml []interface{}, err error) {…………}
这个方法,参数怎么填才能调用成功啊
beego orm自动建表时字段default值不设置的解决办法

在使用beego的orm建表时,我的模型是这样建立的 type Test struct {Id int64Name stringSex int64 Age int64Content string } content字段设置默认为空,Sex字段设置默认为1,那么生成的表确...

别人说我名字很长
2014/11/15
0
0
beego 1.6.0 版本发布,Go 应用框架

距离上一次发布1.5版本已经半年了,这半年里面我们改进了很多,其实中间又想要发布一个小版本的,但是后来还是想想就改的彻底一点,所以这次改动相当多,中间又因为一些兼容性的问题所以特地...

astaxie
2016/01/18
9.6K
55
beego 视频教程--beegoCasts

beego的文档应该还算比较完整的,但是我还是希望通过更多地素材来推进beego的发展,视频教程应该是一个非常直观的学习方式,所以决定在发布beego1.2之后开始制作一系列的beego视频教程,主要教大...

astaxie
2014/05/18
1K
1
Go 应用框架 beego 1.7.0,新增改进功能

beego 1.7.0 版本发布了。beego是一个用Go开发的应用框架,思路来自于tornado,路由设计来源于sinatra 新增改进功能: 1. Filter访问速度提升7.5倍以上 #1799 2. Gzip压缩的时候支持不同的l...

astaxie
2016/08/30
5.3K
30
beego 中使用关联查询( join 查询)

beego 中使用关联查询( join 查询) 文档所在网址:这里 但直接使用 RelatedSel() 是不行,还必须先在 model中定义: 定义表字段为"rel(fk)",即外键,要定义其它类型的,请看文档。 命令行自...

阿桂1989
2018/07/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

万能的Python,还能用来制作高大上的进度条?

对于开发或者运维来说,使用Python去完成一些跑批任务,或者做一些监控事件是非常正常的情况。那么如何有效的监控任务的进度,除了在任务中加上log外,还能不能有另一种方式来了解任务进展到...

上海小胖
41分钟前
4
0
如何嵌入 HTML 到 iPython notebook的输出

如何嵌入 HTML 到 iPython notebook的输出 iPython notebook中可以嵌入 HTML,也适用于JupyterHub和JupyterLab环境。不仅可以显示常用的HTML标签文本,甚至可以嵌入脚本交互操作和Frame分隔框...

openthings
今天
2
0
四、RabbitMQ3.7在CentOS7下的安装

安装依赖 sudo yum install -y gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git 创建yum源 vi /etc/yum.repos.d/rabbitmq-erlang.repo [......

XuePeng77
今天
2
0
android 延长Toast的时长

示例:myToast(5000,"hello"); public void myToast(int showTime, String msg) { Toast hello = Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT); new CountDownTimer(......

雨焰
昨天
4
0
浅谈mybatis的日志适配模式

Java开发中经常用到的日志框架有很多,Log4j、Log4j2、slf4j等等,Mybatis定义了一套统一的日志接口供上层使用,并为上述常用的日志框架提供了相应的适配器。有关适配器模式例子可以参考 设计...

算法之名
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部