「go商城」gin+gorm实现CRUD

gorm是什么?

ORM-Object-Relationl Mapping,即对象关系映射,这里的Relationl指的是关系型数据库它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了GORM就是go语言实现的一个ORM库特点:

全特性 ORM (几乎包含所有特性)

模型关联 (一对一, 一对多,一对多(反向), 多对多, 多态关联)

钩子 (Before/After Create/Save/Update/Delete/Find)

预加载

事务

复合主键

SQL 构造器

自动迁移

日志

基于GORM回调编写可扩展插件

全特性测试覆盖

开发者友好

GORM之简单CRUD

增加(Create)

user := User{Name: “Jinzhu”, Age: 18, Birthday: time.Now()}db.NewRecord(user) // => 返回 `true` ,因为主键为空db.Create(&user)db.NewRecord(user) // => 在 `user` 之后创建返回 `false`

检索(Retrieve)

// 获取第一条记录,按主键排序db.First(&user)//// SELECT * FROM users ORDER BY id LIMIT 1;// 获取一条记录,不指定排序db.Take(&user)//// SELECT * FROM users LIMIT 1;// 获取最后一条记录,按主键排序db.Last(&user)//// SELECT * FROM users ORDER BY id DESC LIMIT 1;// 获取所有的记录db.Find(&users)//// SELECT * FROM users;// 通过主键进行查询 (仅适用于主键是数字类型)db.First(&user, 10)//// SELECT * FROM users WHERE id = 10;

更新(Update)

db.First(&user)user.Name = “jinzhu 2″user.Age = 100db.Save(&user)// 如果单个属性被更改了,更新它db.Model(&user).Update(“name”, “hello”)//// UPDATE users SET name=’hello’, updated_at=’2013-11-17 21:34:10′ WHERE id=111;// 使用组合条件更新单个属性db.Model(&user).Where(“active = ?”, true).Update(“name”, “hello”)//// UPDATE users SET name=’hello’, updated_at=’2013-11-17 21:34:10′ WHERE id=111 AND active=true;

删除(Delete)

// 删除一条存在的记录db.Delete(&email)//// DELETE from emails where id=10;// 为删除 SQL 语句添加额外选项db.Set(“gorm:delete_option”, “OPTION (OPTIMIZE FOR UNKNOWN)”).Delete(&email)//// DELETE from emails where id=10 OPTION (OPTIMIZE FOR UNKNOWN);

如果模型中有 DeletedAt 字段,它将自动拥有软删除的能力!当执行删除操作时,数据并不会永久的从数据库中删除,而是将 DeletedAt 的值更新为当前时间。具体的使用可查看gorm 官方文档

项目中声明全局GVA_DB

在项目中我们定义一个全局的GVA_DB,方便使用时调用

// global.govar ( GVA_DB *gorm.DB )

后续我们在需要查询数据库时便可直接通过global.GVA_DB使用比如创建商品信息:我们先通过查询分类是否存在,然后再创建商品

func (m *ManageGoodsInfoService) CreateMallGoodsInfo(req manageReq.GoodsInfoAddParam) (err error) { var goodsCategory manage.MallGoodsCategory err = global.GVA_DB.Where(“category_id=? AND is_deleted=0”, req.GoodsCategoryId).First(&goodsCategory).Error if goodsCategory.CategoryLevel != enum.LevelThree.Code() { return errors.New(“分类数据异常”) } if !errors.Is(global.GVA_DB.Where(“goods_name=? AND goods_category_id=?”, req.GoodsName, req.GoodsCategoryId).First(&manage.MallGoodsInfo{}).Error, gorm.ErrRecordNotFound) { return errors.New(“已存在相同的商品信息”) }…… err = global.GVA_DB.Create(&goodsInfo).Error return err}

通过gorm的链式操作可以很方便的进行crud操作

分页查询

分页查询是项目中经常使用到的功能,当指定条件查询的数据量过大时,如果我们将数据一次性返回,会对数据库造成较大的负荷,同时降低接口的性能,通常我们会使用分页查询的方式让数据进行分段展示,从而保障接口的性能。在gorm中我们实用Offset,和Count来实现分页

Offset 指定在开始返回记录之前要跳过的记录数。

db.Offset(3).Find(&users)//// SELECT * FROM users OFFSET 3;// 用 -1 取消 OFFSET 限制条件db.Offset(10).Find(&users1).Offset(-1).Find(&users2)//// SELECT * FROM users OFFSET 10; (users1)//// SELECT * FROM users; (users2)

Count 获取模型记录数。注意:在查询链中使用 Count 时,必须放在最后一个位置,因为它会覆盖 SELECT 查询条件。

db.Where(“name = ?”, “jinzhu”).Or(“name = ?”, “jinzhu >2”).Find(&users).Count(&count)//// SELECT * from USERS WHERE name = ‘jinzhu’ OR name = >’jinzhu 2′; (users)//// SELECT count(*) FROM users WHERE name = ‘jinzhu’ OR >name = ‘jinzhu 2’;

我们通过前端的传递过来的分页数据进行查询

func (m *ManageGoodsInfoService) GetMallGoodsInfoInfoList(info manageReq.MallGoodsInfoSearch, goodsName string, goodsSellStatus string) (err error, list interface{}, total int64) { limit := info.PageSize offset := info.PageSize * (info.PageNumber – 1) // 创建db db := global.GVA_DB.Model(&manage.MallGoodsInfo{}) var mallGoodsInfos []manage.MallGoodsInfo // 如果有条件搜索 下方会自动创建搜索语句 err = db.Count(&total).Error if err != nil { return } if goodsName != “” { db.Where(“goods_name =?”, goodsName) } if goodsSellStatus != “” { db.Where(“goods_sell_status =?”, goodsSellStatus) } err = db.Limit(limit).Offset(offset).Order(“goods_id desc”).Find(&mallGoodsInfos).Error return err, mallGoodsInfos, total}

总结

该商城作为gin的学习项目,没有很复杂的逻辑,所有业务逻辑均通过Mysql实现。包括后面将要介绍的登录态,也是如此。所有代码已上传github,有兴趣的可以访问https://github.com/newbee-ltd/newbee-mall-api-go/,如果有更好的建议也欢迎提交issure,pr

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年6月28日 17:35
下一篇 2022年6月28日 17:35

相关推荐

  • 30个无加盟费的项目(茶颜悦色奶茶店加盟费多少)

    茶颜悦色又爆了,8月18日,茶颜悦色南京门店正式开业,开张不到半小时,门店就人满为患,消费者的购买热情十分高涨,而由于人流量过大造成拥堵,茶颜悦色也不得不暂停营业。 当然,这里面排…

    2022年11月27日
  • 净利润率越高越好吗(净利润率多少合适)

    一、持续增收不增利,平均净利润率首次跌入个位数 2021年,增收不增利依旧是行业主流。具体来看,大部分企业营业收入呈增长态势,E50企业平均同比增速达到17.3%,但是利润增速则明…

    2022年11月26日
  • 《宝可梦朱紫》獒教父属性是什么?獒教父属性一览

    宝可梦朱紫里獒教父是一只很强的宝可梦,很多玩家不清楚獒教父的属性是什么样的,下面就给大家带来宝可梦朱紫獒教父属性一览,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 獒教父属性一览…

    2022年11月25日
  • 《宝可梦朱紫》梦特性怎么获得?隐藏特性获取方法推荐

    宝可梦朱紫里有很多宝可梦都是拥有梦特性会变强的宝可梦,很多玩家不知道梦特性怎么获得,下面就给大家带来宝可梦朱紫隐藏特性获取方法推荐,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 …

    2022年11月25日
  • 规范透明促PPP高质量发展——16万亿元大市场迎来新规

    近日,财政部印发《关于进一步推动政府和社会资本合作(PPP)规范发展、阳光运行的通知》,从做好项目前期论证、推动项目规范运作、严防隐性债务风险、保障项目阳光运行四个方面进一步规范P…

    2022年11月25日
  • 客服的岗位职责怎么写(客服工作内容及职责)

    各位小伙伴们大家周一好,又到了每周一给大家分享干货内容的时候啦~ 本期来跟大家分享一下客服工作管理流程以及客服岗位里面的每项职能岗位的核心细则,也是干货满满推荐收藏~ 一.补偿流程…

    2022年11月25日
  • 什么是推广cpa一篇文章带你看懂CPA推广渠道

    CPA渠道 CPA指的是按照指定的行为结算,可以是搜索,可以是注册,可以是激活,可以是搜索下载激活,可以是绑卡,实名认证,可以是付费,可以是浏览等等。甲乙双方可以根据自己的情况来定…

    2022年11月25日
  • 推荐3种白手起家的赚钱项目(白手起家赚钱项目有哪些)

    如今社会压力非常的大,家有老少要养活,这些都加速了穷人想要创业的欲望,但是创业路总是那么的艰难,资金就是创业的重头戏,所以选择一个低成本又赚钱的项目是大多数人最期望的了,那么有哪些…

    2022年11月25日
  • 抖音直播带货有哪些方法技巧(抖音直播带货有哪些痛点)

    如今抖音这个短视频的变现能力越来越突显了,尤其是在平台上开通直播,更具有超强的带货属性,已经有越来越多的普通人加入到其中了。不过直播带货虽然很火,但是也不是每个人都能做好的,那么在…

    2022年11月24日
  • 淘宝直播开通后带货链接怎么做(淘宝直播需要开通淘宝店铺吗)

    直播带货无论是对于商家来说还是主播收益都是非常可观的,所以不少平台都有直播带货功能,一些小伙伴也想加入淘宝直播,那么淘宝直播开通后带货链接怎么做?下面小编为大家带来淘宝直播开通后带…

    2022年11月24日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息