• 通过实战总结的 使用GoFrame小技巧


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

    gf gen dao

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

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

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

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

    如果你也遇到了类似问题,去排查一下配置文件吧。

    设置参数可传可不传

    这个场景和是否使用GoFrame框架没关系,如果你也需要设置这个参数可传可不传,也能这么搞:

    使用 ...interface{}

    比如:

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

    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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    模型关联

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

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

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

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

    大家还是看官方示例吧:

    「模型关联-动态关联-ScanList」:https://goframe.org/pages/viewpage.action?pageId=1114326

    「模型关联-静态关联-With特性」:https://goframe.org/pages/viewpage.action?pageId=7297190

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

    添加数据

    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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    gomeGoods.MainImgs的定义:

    MainImgs []string `json:"mainImgs"`
    
    • 1

    批量插入数据

    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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    配置插件自动生成service

    如果你在用goframe V2.1 以上版本,生成service强烈建议配置goland插件,而不是每次修改logic后手动敲脚本。

    配置方式如下:

    配置文件链接:https://goframe.org/pages/viewpage.action?pageId=49770772&preview=/49770772/49770777/watchers.xml

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

    注意:千万不要手动修改自动生成的代码。(因为自己修改的代码后期肯定会被覆盖掉)

    总结

    纸上得来终觉浅,觉知此事要躬行。

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

    一起学习

    欢迎在CSDN私信我,如果没能及时回复,欢迎扫下方公众号关注我:

  • 相关阅读:
    阿里巴巴2022届秋招面试真题和答案!
    No ‘Access-Control-Allow-Origin‘ header前端浏览器跨域用LiveServer处理
    祝贺埃文科技入选河南省工业企业数据安全技术支撑单位
    [Err] 1093 - You can‘t specify target table ‘*****‘ for update in FROM clause
    Pandas--read_csv,to_csv参数说明
    LCD DRM component 框架分析
    微信h5纸条交友盲盒项目完整版可上线运营|新版springboot+vue前后端分离项目源码授权
    JAVA面试题大全希望能够挑动大家的味蕾!(附赠BAT面试大全)
    matlab EL image绘制
    分布式存储系统之Ceph基础
  • 原文地址:https://blog.csdn.net/w425772719/article/details/127976660