GoFrame避坑指南和实践干货

简介: 生成的dao文件和同事们的不一致,生成文件成功,但是对应的Columns是空的,虽然有这个方法,但是方法内没有值。我的版本比同事们的略高,我一直以为是这个原因,各种降级和同事保持一致的版本后还是不行。

gf gen dao


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


生成的dao文件和同事们的不一致,生成文件成功,但是对应的Columns是空的,虽然有这个方法,但是方法内没有值。我的版本比同事们的略高,我一直以为是这个原因,各种降级和同事保持一致的版本后还是不行。


最终发现:是配置文件中连接的数据库不对。


因为没有连接到数据库,所以取不到列值;但是因为配置文件中约定了表名,文件正常生成了。


设置参数可不传


使用 ...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
}


使用with关联取值而不是join


能用with的一定用with关联取值,而不是用join。

发现自己整理的栗子没有官网的好,大家还是看官网吧: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
}


相关文章
|
5月前
|
IDE 测试技术 Go
【字节跳动青训营】后端笔记整理-3 | Go语言工程实践之测试
用于验证已经修改或新增功能后,软件的既有功能是否受到影响。
107 2
|
5月前
|
存储 JSON 数据格式
效率工具RunFlow完全手册之进阶篇
RunFlow进阶指南包括搜索文件、计算器、解散文件夹、独立窗口运行、数据导入导出(JSON格式)及同步(本地及云服务如OneDrive)。此外,还提供定时任务功能,利用Cron表达式设定如每日12点执行清理。
61 1
效率工具RunFlow完全手册之进阶篇
|
敏捷开发 架构师 Java
GitHub上线重量级分布式架构原理设计笔记,开源的东西看着就是爽
在分布式系统中,一次业务处理可能需要多个应用来实现,比如用户发送一次下单请求,就涉及到订单系统创建订单,库存系统减库存,而对于一次下单,订单创建与减库存应该是要同时成功或者同时失效,但在分布式系统中,如果不做处理,就很有可能订单创建成功,但是减库存失败,那么解决这类问题,就需要用到分布式事务……
|
11月前
|
安全 调度 C语言
《C++避坑神器·十九》C++多线程使用,啥也不懂看它就对了
《C++避坑神器·十九》C++多线程使用,啥也不懂看它就对了
117 0
|
11月前
|
编译器 C++
《C++避坑神器·八》史上最全模板的使用
《C++避坑神器·八》史上最全模板的使用
44 0
|
11月前
|
C++
《C++避坑神器·二十》C++智能指针简单使用
《C++避坑神器·二十》C++智能指针简单使用
43 0
|
12月前
|
缓存 监控 Java
从零到一构建完整知识体系,阿里最新SpringBoot原理最佳实践真香
Spring Boot不用多说,是咱们Java程序员必须熟练掌握的基本技能。工作上它让配置、代码编写、部署和监控都更简单,面试时互联网企业招聘对于Spring Boot这个系统开发的首选框架也是考察的比较严苛,如果你不是刚入行,只是停留在会用的阶段,那是远远不够的。 虽然Spring Boot易上手,但很多小伙伴也是时不时会跟我反映,Spring Boot技术体系太庞杂了,包含了太多的技术组件,不知道到底该如何高效学习,建立起全面且完整的Spring Boot技术体系和实践技巧,这个时候站在巨人的肩膀上学习就变得非常有必要了,汲取大佬们的学习经验,避免工作面试踩坑,轻松构建Spring Bo
|
前端开发 Java 大数据
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第六节)
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第六节)
|
SQL Java 关系型数据库
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第五节)
在上一节中,我们成功将数据从前台的JSP页面传递到了controller层,但是还没有写service层,老实说还有很多工作没有,尤其是和数据库的链接方面的,所以,这一节,我们专门来处理一下关于数据库连接方面的东西。
下一篇
无影云桌面