欢迎来到 通辽市某某化工涂料售后客服中心
全国咨询热线:020-123456789
联系我们

地址:联系地址联系地址联系地址

电话:020-123456789

传真:020-123456789

邮箱:admin@aa.com

新闻中心
「go商城」gin+gorm实现CRUD
  来源:通辽市某某化工涂料售后客服中心  更新时间:2024-04-30 10:32:53

「go商城」gin+gorm实现CRUD

gorm是什么 ?

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

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

模型关联 (一对一 , 一对多,商城m实一对多(反向),商城m实 多对多 ,商城m实 多态关联)

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

预加载

事务

复合主键

SQL 构造器

自动迁移

日志

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

全特性测试覆盖

开发者友好

GORM之简单CRUD

增加(Create)

user := User{ Name: "Jinzhu",商城m实 Age: 18, Birthday: time.Now()}nndb.NewRecord(user) // => 返回 `true` ,因为主键为空nndb.Create(&user)nndb.NewRecord(user) // => 在 `user` 之后创建返回 `false`n

检索(Retrieve)

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

更新(Update)

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

删除(Delete)

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

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

项目中声明全局GVA_DB

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

// global.gonvar (n GVA_DB *gorm.DBn )n

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

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

通过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) { n limit := info.PageSizen offset := info.PageSize * (info.PageNumber - 1)n // 创建dbn db := global.GVA_DB.Model(&manage.MallGoodsInfo{ })n var mallGoodsInfos []manage.MallGoodsInfon // 如果有条件搜索 下方会自动创建搜索语句n err = db.Count(&total).Errorn if err != nil { n returnn }n if goodsName != "" { n db.Where("goods_name =?", goodsName)n }n if goodsSellStatus != "" { n db.Where("goods_sell_status =?", goodsSellStatus)n }n err = db.Limit(limit).Offset(offset).Order("goods_id desc").Find(&mallGoodsInfos).Errorn return err, mallGoodsInfos, totaln}n

总结

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


友情链接英雄联盟史上最强杀神 让你超神英雄大盘点魔兽世界怎么修改字体 wow字体怎么改锁甲猎人幻化:炉石传说版 奥蕾莉亚·风行者COS光遇四周年活动2023大全 sky四周年庆物品奖励一览dnf武器锻造材料有哪些(dnf武器锻造材料获取指南)NBA2K历年代言人及能力值排名,姚明能力值你绝对想象不到!魔兽世界符文精金棒图纸在哪里-符文精金棒图纸获取方法原神鱼饵合成在哪?鱼饵合成材料大全!DNF:深渊异界和团本,你的5000天专属关键词是什么?魔兽世界十二大职业信仰套装,牧师“T3”的小光环你值得拥有!魔兽世界怀旧服永生幽暗手套怎么获得 永生幽暗手套获得途径方法问道乾坤锁送什么魔兽牧师好看的幻化,牧师哪个种族幻化好看《洛克王国》福熙水灵技能属性图鉴轩辕传奇刺客心法加点的问题魔兽世界联盟奥丹姆传送门(奥丹姆传送门任务)怎么分解时装(怎么分解时装和服装)dnf增幅找谁《魔兽世界》wlk重铸盟约任务怎么完成 重铸盟约任务完成方法介绍有没有推荐的甜文小说,不短不长的?魔兽争霸3冰封王座宽屏补丁[分辨率修改工具] 最新版英雄联盟杰斯皮肤最全汇总(英雄联盟杰斯哪款皮肤手感最好)魔力结晶怎么弄,地下城中魔力结晶如何得到魔兽世界怀旧服狂暴战输出/配装的23条魔兽世界幻化党福利,盘点游戏中好看的法杖及获得方法PK赛模板配置 12门派宠物符石特技建议正在阅读:dnf手游导师套多少钱?地下城与勇士M导师套介绍dnf手游导师套多少钱?地下城与勇士M导师套介绍魔兽争霸3:纪念那些曾经闪光的魔兽RPG阴阳师座敷童子技能有什么魔兽世界幻化党福利,盘点游戏中好看的法杖及获得方法魔兽怀旧服:美酒节副本机制遭吐槽,无限刷被取消,奖励缩水魔兽怀旧服附魔攻略(魔兽世界附魔选择推荐)dnf110级版本名望怎么注水 110级版本快速提升名望指南问道乾坤锁,揭秘乾坤锁的秘密【原】你是天才还是精神分裂症?正常人绝对解不出正确答案的三道题苍穹碎片在哪里换知己知彼最重要。魔兽世界怀旧服萨满吃什么合剂魔兽世界巫妖王之怒前夕法师天赋怎么点-魔兽世界巫妖王之怒前夕法师天赋加点推荐不愧是特殊召唤兽,抓鬼都暴2.3万
联系我们

地址:联系地址联系地址联系地址

电话:020-123456789

传真:020-123456789

邮箱:admin@aa.com

0.2408

Copyright © 2024 Powered by 通辽市某某化工涂料售后客服中心   sitemap