使用beego orm上的ORM 提示 missed pk value 这是什么原因

当前访客身份:游客 [
别人说我名字很长
:请问你这个分页跳转到当前页之后,当前页背景颜色...
:引用来自“anan001”的评论大神,求教我获取分页...
:引用来自“天佑我儿”的评论我想问下,为什么你的...
:大神,求教我获取分页 页号
:Downloadify IE不行。。导出都在一个格子里。。...
:Downloadify的下载路径有误,应该是: https://...
:我想问下,为什么你的关联查询是 “LEFT JOIN”,...
:js代码中的class样式属性,很多跟html中的对应不...
:引用来自“3xxx”的评论 map[string]interface{}...
:map[string]interface{}怎么转成map[]string呢...
今日访问:148
昨日访问:256
本周访问:404
本月访问:3680
所有访问:69868
beego for Datatables 数据
发表于2年前( 14:22)&&
阅读(221)&|&评论()
0人收藏此文章,
工具 tools/datatables.go
package tools
"/astaxie/beego/context"
"/astaxie/beego/orm"
* aColumns []string `SQL Columns to display`
* thismodel interface{} `SQL model to use`
* ctx *context.Context `Beego ctx which contains httpcontext`
* maps []orm.Params `return result in a interface map as []orm.Params`
* count int64 `return iTotalDisplayRecords`
* counts int64 `return iTotalRecords`
func Datatables(aColumns []string, thismodel interface{}, Input *context.BeegoInput, where interface{}) (maps []orm.Params, count int64, counts int64) {
* 分页请求
iDisplayStart, _ := strconv.Atoi(Input.Query("iDisplayStart"))
iDisplayLength, _ := strconv.Atoi(Input.Query("iDisplayLength"))
* Ordering
* 排序请求
querysOrder := []string{}
if iSortCol_0, _ := strconv.Atoi(Input.Query("iSortCol_0")); iSortCol_0 & -1 {
ranges, _ := strconv.Atoi(Input.Query("iSortingCols"))
for i := 0; i & i++ {
istring := strconv.Itoa(i)
if iSortcol := Input.Query("bSortable_" + Input.Query("iSortCol_"+istring)); iSortcol == "true" {
sordir := Input.Query("sSortDir_" + istring)
thisSortCol, _ := strconv.Atoi(Input.Query("iSortCol_" + istring))
if sordir == "asc" {
querysOrder = append(querysOrder, aColumns[thisSortCol])
querysOrder = append(querysOrder, "-"+aColumns[thisSortCol])
* Filtering
* 快速过滤器
//querysFilter := []string{}
cond := orm.NewCondition()
if len(Input.Query("sSearch")) & 0 {
for i := 0; i & len(aColumns); i++ {
cond = cond.Or(aColumns[i]+"__icontains", Input.Query("sSearch"))
/* Individual column filtering */
for i := 0; i & len(aColumns); i++ {
if Input.Query("bSearchable_"+strconv.Itoa(i)) == "true" && len(Input.Query("sSearch_"+strconv.Itoa(i))) & 0 {
cond = cond.And(aColumns[i]+"__icontains", Input.Query("sSearch"))
//where条件
wheres, ok := where.(map[string]interface{})
for k, v := range wheres {
fmt.Println(k, v)
cond = cond.And(k, v)
fmt.Println(where)
//用户管理GID
gid := Input.Query("gid")
if gid != "" {
gid2, _ := strconv.Atoi(gid)
cond = cond.And("gid", int64(gid2))
//客服管理
accountid := Input.Query("aid")
fmt.Println(accountid)
if accountid != "" {
aid, _ := strconv.Atoi(accountid)
cond = cond.And("accountid", int64(aid))
* 数据请求
o := orm.NewOrm()
qs := o.QueryTable(thismodel)
counts, _ = qs.Count()
qs = qs.Limit(iDisplayLength, iDisplayStart)
qs = qs.SetCond(cond)
for _, v := range querysOrder {
qs = qs.OrderBy(v)
qs.Values(&maps)
count, _ = qs.Count()
return maps, count, counts
* 显示datatables列表页数据
func (this *UserController) List() {
aColumns := []string{
"Username",
"Realname",
var where = make(map[string]interface{})
err := this.CheckRule("isUserAll")
if err != nil {
where["gid"] = this.GetUserGid()
fmt.Println(where)
maps, count, counts := d.Datatables(aColumns, user, this.Ctx.Input, where)
var output = make([][]interface{}, len(maps))
for i, m := range maps {
for _, v := range aColumns {
if v == "Lasttime" {
output[i] = append(output[i], m[v].(time.Time).Format(" 15:04:05"))
output[i] = append(output[i], m[v])
data := make(map[string]interface{}, count)
data["sEcho"] = this.GetString("sEcho")
data["iTotalRecords"] = counts
data["iTotalDisplayRecords"] = count
data["aaData"] = output
this.Data["json"] = data
this.ServeJson()
前端databases
//datatables显示列表
var table = $('#datatables');//表格对象
table.dataTable( {
"sDom": "&'row-fluid'&'span6'l&&'span6'f&r&t&'row-fluid'&'span6'i&&'span6'p&&",//定义DataTable布局的一个强大属性
"sPaginationType": "bootstrap",//分页样式使用bootstrap
"oLanguage": {//语言设置
"sLengthMenu": "每页显示
_MENU_ 条记录",
"sInfo": "从 _START_ 到 _END_ /共 _TOTAL_ 条数据",
"oPaginate": {
"sFirst": "首页",
"sPrevious": "前一页",
"sNext": "后一页",
"sLast": "尾页"
"sZeroRecords": "抱歉, 没有找到",
"sInfoEmpty": "没有数据"
"bProcessing": true, //当datatable获取数据时候是否显示正在处理提示信息。
"bServerSide": true, //客户端处理分页
"sAjaxSource": "/rule/list", //ajax请求地址
'bStateSave': true, //开关,是否打开客户端状态记录功能。这个数据是记录在cookies中的,打开了这个记录后,即使刷新一次页面,或重新打开浏览器,之前的状态都是保存下来的
"aoColumnDefs": [{ //给每个单独的列设置不同的填充,或者使用aoColumns也行
"aTargets": [3],
"mData": null,
"bSortable": false,
"bSearchable": false,
"mRender": function (data, type, full) {
if(full[3] == 1){
return "路由规则"
}else if(full[3] == 2){
return "普通规则"
"aTargets": [4],
"mData": null,
"bSortable": false,
"bSearchable": false,
"mRender": function (data, type, full) {
return '&a data-toggle="modal" data-target="#myModal"
data-title="' + full[0] + '"
class="btn btn-success" href="#"&&i class="icon-edit icon-white"&&/i&修改&/a&' +'&&'+'&a data-title="' + full[0] + '"
class="btn btn-danger" href="#' + full[0] + '"&&i class="icon-user icon-white"&&/i&删除&/a&';
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读beego中路由(Router)参数和表单(Form)参数的区别和获取 - Go友团
在beego中,视图层有两种叫做参数的东西,有时候很让人困惑。它们分别是路由参数和表单参数。
beego的路由映射支持灵活的结构,比如对于这种/blog/:catName可以表示的是某一个分类下的blog列表,那么这里的:catName就是路由参数;如果说我们要对这个分类下面的blog进行分页,想查看第10页的blog,那么我们的url可能变成了/blog/:catName?page=10这种格式,那么这里的page就是表单参数。表单参数既可以是GET类型的参数也可以是POST类型的参数,总之都叫做表单参数。
1. 获取路由参数的方法
可以使用下面的方法来获取路由参数:
func (c *Controller) GetInt(key string) (int64, error)
func (c *Controller) GetBool(key string) (bool, error)
func (c *Controller) GetFloat(key string) (float64, error)
func (c *Controller) GetString(key string) string
我们为了演示这些方法构建了一个路径:
beego.Router(&#34;/blog/:catId/:catName:/:catPublish:/:catPrice&#34;, &controllers.MainController{}, &#34;get:Blog&#34;)
然后我们可以用下面的方法获取路径参数:
func (this *MainController) Blog() {
catId, _ := this.GetInt(&#34;:catId&#34;)
catName := this.GetString(&#34;:catName&#34;)
catPublish, _ := this.GetBool(&#34;:catPublish&#34;)
catPrice, _ := this.GetFloat(&#34;:catPrice&#34;)
beego.Debug(fmt.Sprintf(&#34;Category Id:%d Name:%s Publish:%v Price:%f&#34;, catId, catName, catPublish, catPrice))
然后访问http://localhost:8080/blog/30/beego/true/98.45,可以得到下面的输出:
14:25:04 [D] Category Id:30 Name:beego Publish:true Price:98.450000
14:25:04 [C] the request url is
/blog/30/beego/true/98.45
其实我们可以去看看这些Get方法,比如GetString(/astaxie/beego/controller.go 367行):
func (c *Controller) GetString(key string) string {
return c.Ctx.Input.Query(key)
从上面的代码可以看到实际上这些路径参数都是从c.Ctx.Input里面获取的,而这个参数类型是Context,定义在</astaxie/beego/context/context.go里面。
type Context struct {
*BeegoInput
*BeegoOutput
*http.Request
ResponseWriter http.ResponseWriter
_xsrf_token
然后我们再看看Context里面的Input,这是一个*BeegoInput类型(定义在</astaxie/beego/context/input.go)里面:
type BeegoInput struct {
CruSession
session.SessionStore
map[string]string
map[interface{}]interface{} // store some values in this context when calling context in filter or controller.
*http.Request
RequestBody
RunController reflect.Type
然后我们再看这个结构体的Query方法的定义:
// Query returns input data item string by a given string.
func (input *BeegoInput) Query(key string) string {
if val := input.Param(key); val != &#34;&#34; {
return val
if input.Request.Form == nil {
input.Request.ParseForm()
return input.Request.Form.Get(key)
我们惊奇地发现这个Query方法并不单纯,它同时支持查询路由参数和表单参数。所以一般情况下你也可以用来查询表单参数。
2. 获取表单参数的方法
上面我们看过了获取路由参数的方法,这里我们再看一下获取表单参数的方法。在上面的获取路由参数的讲解最后,我们发现可以使用和上面相同的方法来获取表单参数。
func (c *Controller) GetInt(key string) (int64, error)
func (c *Controller) GetBool(key string) (bool, error)
func (c *Controller) GetFloat(key string) (float64, error)
func (c *Controller) GetString(key string) string
验证很简单,使用这样的url:http://localhost:8080/blog/30/beego/true/98.45?page=10 和代码:
page, _ := this.GetInt(&#34;page&#34;)
beego.Debug(&#34;Page&#34;, page)
14:41:07 [D] Page 10
当然除了上面的方法之外,还有两个方法可以用来获取表单参数:
GetStrings
func (c *Controller) GetStrings(key string) []string
用来获取比如多选框的值
func (c *Controller) GetFile(key string) (multipart.File, *multipart.FileHeader, error)
用来获取上传的文件
好了,其实一般情况下,获取路由参数和表单参数不会对用户如此透明,直接用GetXXX方法获取就可以了。
感谢@jemygraw
贴出这么高质量的文章。
源码分析细致,感谢分享。
这简直就是源码分析beego啊,@jemygraw 加入beego文档组吧,beego文档靠你了
#3 @astaxie 嗯,您可以分配一点任务给我做嘛。
通过GetFile() 获取到的文件名(路径) 被清掉了所有的 \
,有什么方法保留这些\吗?
#5 @fzu_huang 举个例子吧,我明天测试看看。
#6 @jemygraw 比如一个简单的文件上传,路径是c:\Administrator\123.txt
经过GetFile() 得到一个包含了FileName的结构体, 里面的filename是c:Administrator123.txt
#7 @fzu_huang 很抱歉,无法重现你的问题。
&form action=&#34;/upload&#34; method=&#34;POST&#34; enctype=&#34;multipart/form-data&#34;&
&input name=&#34;file&#34; type=&#34;file&#34;/&&input value=&#34;upload&#34; type=&#34;submit&#34;/&
_, fh, _ := this.GetFile(&#34;file&#34;)
fmt.Println(fh.Filename)
这里根本得不到路径,就只能得到一个文件名而已。beego orm自动建表时字段default值不设置的解决办法 - 推酷
beego orm自动建表时字段default值不设置的解决办法
在使用beego的orm建表时,我的模型是这样建立的
type Test struct {
int64 `orm:&default(1)&`
Content string `orm:&default('')&`
content字段设置默认为空,Sex字段设置默认为1,那么生成的表确并没有default,这不科学,于是我翻了下源码,发现设置default的这段被注释了,位置在 /astaxie/beego/orm/cmd_utils.go
155 // if fi.initial.String() != && {
column += & DEFAULT & + fi.initial.String()
这三行注释了,果断打开之(哥测了,打开没分险,大胆的干吧),欧克,建表的时候解决了字段default问题了
接下来,如果已经有了表,然后要增加一个字段的时候,仍然会遇到字段没有default的情况,我们加一下,还是这个文件,在第107行
if fi.initial.String() != && {
typ += & DEFAULT & + fi.initial.String()
增加字段的时候就欧了,修改字段的beego没有做,希望能整个
已发表评论数()
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
排版有问题
没有分页内容
视频无法显示
图片无法显示}

我要回帖

更多关于 beego orm 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信