有朋友问我能不能搞一个GoFrame技巧篇,让新手少踩坑的那种。今天他来了!

gf gen dao

生成dao层的脚手架工具很好用,我遇到的坑是这样的:

生成的dao文件和搭档们的不一致,生成文件成功,可是对应的Columns办法是空的。虽然有这个办法,可是办法内没有值。我的版别比搭档们的略高,我一向以为是这个原因,各种降级和搭档保持一致的版别后还是不可。

终究发现:是装备文件中连接的数据库不对。

由于没有连接到数据库,所以取不到列值;可是由于装备文件中约好了表名,文件正常生成了。

假如你也遇到了类似问题,去排查一下装备文件吧。

设置参数可传可不传

这个场景和是否运用GoFrame结构没关系,假如你也需求设置这个参数可传可不传,也能这么搞:

运用 ...interface{}

比如:

func GetXxx(xxx ...interface{}) { }

model作为结构体类型

当我们的事务比较复杂,需求更新多个相关表时,能够把需求修正的表一致界说到一个结构体中,而不是想到一个model处理一个model。

这种思维比较好,把相关的model一致封装到一个结构体中,很明晰,也能避免有遗漏。

type GoodsRelevantItem struct {
   Shop        *model.Shops
   Brand       *model.GoodsBrand
   Desc        *model.GoodsDescription
   Cover       []*model.GoodsCover
   Attributes  []*model.GoodsAttributes
   Goods       *model.Goods
   DisCategory []*model.DisCategory
}

模型相关

关于模型相关,官方是这么说的:

GoFrame的ORM没有选用其他ORM常见的BelongsTo, HasOne, HasMany, ManyToMany这样的模型相关设计,这样的相关关系保护较繁琐,例如外键束缚、额外的标签备注等,对开发者有必定的心智担负。 因而gf结构不倾向于通过向模型结构体中注入过多复杂的标签内容、相关属性或办法,并一如既往地尝试着简化设计,目标是使得模型相关查询尽可能得易于理解、运用便捷。

我也花时间整理了自己在项目中的示例,可是发现自己整理的比如没有官网的好理解,所以终究我还是把自己的比如删掉了。

「模型相关」这部分比较硬核且有用,可是也的确有理解成本。

大家还是看官方示例吧:

「模型相关-动态相关-ScanList」:goframe.org/pages/viewp…

「模型相关-静态相关-With特性」:goframe.org/pages/viewp…

我也会把官方示例放到阅读原文中,方便大家去检查。

增加数据

goframe十分灵敏,刺进的数据能够是结构体也能够是map,也能够是map类型的切片,来实现批量增加。

举个栗子:

主程序如下:

//主图轮播
goodsImgs := []map[string]interface{}{} //图片集
for k, img := range gomeGoods.MainImgs {
   goodsImg := map[string]interface{}{} //图片
   goodsImg["cover"] = "http:" + img
   goodsImg["goods_id"] = gconv.Int(goodsDetail["goods_id"])
   goodsImg["sort"] = k
   goodsImgs = append(goodsImgs, goodsImg)
}
//增加主图
err = m.AddGoodsCover(ctx, tx, goodsImgs)
if err != nil {
   err = errors.New("增加产品主图失利")
   return err, 0
}

gomeGoods.MainImgs的界说:

MainImgs []string `json:"mainImgs"`

批量刺进数据

batch指定了批量刺进时一次刺进的条数

func (m *goodsMessageService) AddGoodsCover(ctx context.Context, tx *gdb.TX, goodsImgs g.List) (err error) {
   if len(goodsImgs) == 0 {
      return errors.New("暂无数据")
   }
   _, err = dao.GoodsCover.TX(tx).Ctx(ctx).Batch(len(goodsImgs)).Insert(goodsImgs)
   checkErr(err, "UpdateGoodsCover")
   return
}

装备插件主动生成service

假如你在用goframe V2.1 以上版别,生成service强烈主张装备goland插件,而不是每次修正logic后手动敲脚本

装备方式如下:

通过实战总结的 Go语言小技巧

装备文件链接:goframe.org/pages/viewp…

当主动生成的文件报错,或许呈现一些“神奇的问题”,主张把生成的文件删除掉。在对应的logic代码空白处随意敲个回车或许空格就能生成新的service文件。

留意:千万不要手动修正主动生成的代码。(由于自己修正的代码后期肯定会被覆盖掉)

总结

纸上得来终觉浅,觉知此事要实践。

编程是一门手工活,必定多着手,重实践,才能获得长足的进步。

一同学习

通过实战总结的 Go语言小技巧

大众号:程序员升职加薪之旅

微信号:wangzhongyang1993

B站视频:王中阳Go