范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Gorm高级查询

  前言
  越高级,越复杂的查询,也同时意味着高耗,但是平时有一些数据少,但是业务复杂的场景,可以使用下。 这里主要说明的是  go  中使用 gorm  进务查询。gorm import 依赖 "database/sql"  "fmt"  "github.com/jinzhu/gorm"  _ "github.com/jinzhu/gorm/dialects/mysql" 将查询结果放到一个 struct 中// 根据主键查询第一条记录 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; 查询条件是map 或者 struct 查询
  有时候代码是可需要映射到一个  map  结构, 不需要映射到一个 结构体中,可以写成如下:for update
  在涉及并发的场景,往往需要加锁互斥,和  Java  类似, Go 中也有加行锁的方式,加 for update  即可。
  一般写法如下: // 为查询 SQL 添加额外的 SQL 操作 db.Set("gorm:query_option", "FOR UPDATE").First(&user, 10) //// SELECT * FROM users WHERE id = 10 FOR UPDATE;
  示例代码: err := db.Model(&XXX{}).Set("gorm:query_option", "FOR UPDATE").Where("XXX=?", XXX).First(&XXX).Error  if err != nil {   if err == gorm.ErrRecordNotFound {    logs.Warn("xxx")    return nil, nil   }   logs.Error("XXX")  } Count 查询
  有时候,我们需要进行简单的数据统计, 比如查询到结果有多少行, var count int64 db.Model(&User{}).Where("name = ?","jinzhu").Or("name = ?","jinzhu 2").Count(&count) // SELECT count(*) FROM users WHERE name = "jinzhu" OR name = "jinzhu 2" db.Model(&User{}).Where("name = ?","jinzhu").Count(&count) // SELECT count(*) FROM users WHERE name = "jinzhu"; (count) 分组计数
  有时候也需要分组统计行数 // 分组计数 users :=[]User{ {Name:"name1"}, {Name:"name2"}, {Name:"name3"}, {Name:"name3"}, } DB.Model(&User{}).Group("name").Count(&count) count // => 3 去重统计// 去重计数 DB.Model(&User{}).Distinct("name").Count(&count) // SELECT COUNT(DISTINCT(`name`)) FROM `users` Group & Having
  有时候我们会使用到数据统计的功能, 比如根据数据库字段  batch_no  进行分组,然后统计总金额,总笔数。
  分组查询统计一般的写法如下: db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Having("sum(amount) > ?", 100).Scan(&results)
  代码示例: type Sum struct {  BatchNo      string `gorm:"column:batch_no" json:"batch_no"`  TotalCounts  int64  `gorm:"column:total_counts" json:"total_counts"`  TotalAmounts int64  `gorm:"column:total_amounts" json:"total_amounts"` }   var result []*Sum  db := db.Model(&Voucher{}).Select("batch_no, count(1) as totalCounts, sum(amount) as totalAmounts")  status := []string{10,20,40}   db = db.Where("no >= ?", startVoucherNo)  db = db.Where("no <= ?", endVoucherNo)  db = db.Where("batch_no IN ?", batchNos)  db = db.Where("status IN ?", status)   if shardingKey >= 0 {   db = db.Where("sharding_key = ", shardingKey)  }   db = db.Group("batch_no")  err := db.Scan(&result).Error  if err != nil {   if err == gorm.ErrRecordNotFound {    logs.CtxWarn("xxx")    return nil, nil   }   logs.CtxError(ctx, "xxx", err)  } Join 查询
  一般来说,很少使用关联查询,但是如果要使用关联查询,可以如下: db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Scan(&results)  // 多连接及参数 db.Joins("JOIN emails ON emails.user_id = users.id AND emails.email = ?", "jinzhu@example.org").Joins("JOIN credit_cards ON credit_cards.user_id = users.id").Where("credit_cards.number = ?", "411111111111").Find(&user) 查询指定函数
  Scopes 允许你指定常用的查询,可以在调用方法时引用这些查询, 也就是说,可以在查询中使用函数。
  举个例子: func AmountGreaterThan1000(db *gorm.DB)*gorm.DB { return db.Where("amount > ?",1000) }  func PaidWithCreditCard(db *gorm.DB)*gorm.DB { return db.Where("pay_mode_sign = ?","C") } func PaidWithCod(db *gorm.DB)*gorm.DB { return db.Where("pay_mode_sign = ?","C") }  db.Scopes(AmountGreaterThan1000,PaidWithCreditCard).Find(&orders) // 查找所有金额大于 1000 的信用卡订单   db.Scopes(AmountGreaterThan1000,PaidWithCod).Find(&orders) // 查找所有金额大于 1000 的货到付款订单 欢迎关注:程序员财富自由之路
  在这里插入图片描述 参考资料https://www.cnblogs.com/zisefeizhu/p/12788060.html https://gorm.io/zh_CN/docs/advanced_query.html https://www.bookstack.cn/read/gorm-2.0/docs-advanced_query.md#4abzu1

苹果官宣iOS16发布时间,新功能终于来了今天随着iOS15。5Beta1的推送,苹果官宣了今年WWDC2022全球开发者大会的召开时间,北京时间6月7日至11日以全线上的形式召开,主题是Calltocode。届时,WWD把OPPOFindN折叠屏做主力机使用2个月,体验合格了吗?不管是什么产品,用的时间久一点,磨平一开始的新鲜感后,这个时候的体验就能看出到底这款产品适不适合了。对于打算将折叠屏作为主力机的朋友来说,尤需如此。我拿到OPPOFindN有段时间性能强超大主摄模组素皮后壳!iQOONeo6外观首度对外公布刚刚今日,iQOO手机官微公布了iQOONeo6预热视频,终于首次公布了新机的背部外观设计。预热视频展示,iQOONeo6的设计相比前代变化非常大,背部为三模组设计,整个模块面积明iPhone14ProMax设计图纸曝光药丸圆孔双挖孔,相机更凸出北京时间2021年9月15日凌晨1点,苹果在ApplePark发布了iPhone13系列手机。按照惯例,今年9月iPhone14系列也将登场。作为科技界关注的焦点,每次iPhone非常实用的Windows11键盘快捷键终极列表如果您在键盘上花费大量时间,那么了解良好的键盘快捷键有助于提高您的工作效率。无论您是要调整应用程序窗口的大小还是在多个显示器上移动它,您都可以在不将手从键盘上移开的情况下进行操作。20站严寒,52斗酷暑日常生活中我们使用的空调到严寒冬天就会出现制热效果差,夏季高温制冷效果低,影响了整个家庭环境的使用和舒适度,今天就是由我来给大家解决这个问题,下面由我来给大家介绍一台空调解决整体效京东裁员一卫星通讯第一个梦,大概是最近被封的缘故,京东物流不给力,正好前段时间jd传言裁员,我梦到我站在一个船的上下舷梯口,扶着扶梯看员工一个个从船上下来,走到不远处将工牌摘下,丢到筐里。突然看到一京东老总刘强东把自己裁员了!评论区都是牛人一早的科技版短讯京东集团宣布,京东集团总裁徐雷先生出任京东集团CEO,将负责日常运营管理,向京东集团董事局主席刘强东先生汇报。刘强东将会把更多的精力投入到1长期战略设计2重大战略决值得捡漏的三款旗舰,12GB256GB,均已跌至新低价之前很多人吐槽国产手机越卖越贵了,事实上,这种说法是非常片面了。因为现在的手机圈竞争相当激烈,内卷严重的情况下,某些厂商为了提升产品竞争力,往往会在价格方面进行妥协。现在,哪怕预算英媒非英语科学论文正被边缘化英国卫报4月4日文章,原题在翻译中迷失对物种的研究是否正因语言障碍而被埋没?瓦莱里娅卡斯塔涅达是一名哥伦比亚生物学家,她长时间在亚马孙研究蛇如何吃毒蛙而不生病。尽管已经有了各种各样港股开盘恒生指数跌0。65,哔哩哔哩跌6。28,携程跌超5金融界4月8日消息今日香港恒生指数开盘跌0。65,报21667。53点,国企指数跌0。83,报7433。49点,红筹指数跌0。13,报4028。87点,恒生科技指数跌1。21,报4
线下体验华为nova9系列手机,这几点功能才是让人入手的真正原因现如今,只要说到国产手机的代表,相信每个人第一时间都会想到华为。可以说在人们心中,最具值得信赖的国产品牌,非华为莫属!特别是旗下nova系列,以年轻人为主力的目标客户群,依靠绚丽酷做朋友圈最靓的仔!华为nova9Pro手机实现你的小目标在网上一项民意调查中显示存在感是现在90后00后十分在意的方面,是经济地位外貌形象等选项中占比最高的选项。所以,也就非常好理解当下年轻人喜欢在朋友圈炫的行为了。想要更好的展示自我,满载时光的滋养,燕之屋碗燕让健康久久停留在父母身边农历九月初九,两阳相重,故叫重阳,代表着天长地久,也代表着尊老敬老爱老。最美重阳,美在一份景致,美在一份孝心!当孩子渐渐长大,父母却在慢慢地老去,年少时,孩子踩着父母的双肩走向远方丰谷有情节打造情感释放器,治愈现代人的情感退化症社会节奏越来越快,人们的情感被高度压缩,但其实每个人心底都渴望一次情感释放。10月23日,丰谷有情节情感释放器快闪店空降成都春熙路,围绕丰谷有情节,把酒满上,让情释放的主题,为都市年轻一代的时尚选择,鸿蒙加持的华为nova9系列手机值得你拥有华为nova9系列手机上市以来,取得了非常不错的口碑,新机型受到了很多年轻人的追捧,小编也在第一时间抢到了华为nova9Pro手机,这也让小编那些喜爱自拍的闺蜜看见之后羡慕的不得了恒洁卫浴为家居新国货品牌代表,受邀参与中国家居家电高峰论坛会恒洁作为新一代国货品牌,非常关注年轻消费者对时尚感和科技型卫浴产品的需求。近年来,恒洁更是以硬核技术,铸造专业卫浴国货品牌形象,引领国货新潮流。日前,以拓设计之界,襄融合之举为主题秋季运动正当时飞利浦耳机A6606带来运动与音乐的完美融合秋天被誉为运动健身的黄金季节,无论是跑步骑行,在享受大汗淋漓的放松和快乐时,也收获着满眼的金黄。而此时如果再有只为运动而生的飞利浦新品骨传导耳机A6606的陪伴,边运动边听音乐,激也太会玩了吧,与汪苏泷共创音乐本月初,全新smart精灵1概念车于IAA慕尼黑国际车展全球首秀,以轻奢风尚与明日科技清晰呈现了品牌焕新方向。今日,轻奢智能纯电汽车科技品牌smart,携手2021百度AI营销创想热销的华为nova9Pro手机告诉你,鸿蒙系统升级用户破1。2亿的秘密全新华为nova9Pro手机,你一定知道吧,它是专为年轻人定制的首款鸿蒙影像旗舰,其主打年轻时尚,更好地满足了年轻人群的需求。在外观影像智能体验等多方面都有新的突破。从6月初发布截汽车行业首个AI共创计划发布smart以明日科技赋能用户共创本月初,全新smart精灵1概念车于IAA慕尼黑国际车展全球首秀,以轻奢风尚与明日科技清晰呈现了品牌焕新方向。今日,轻奢智能纯电汽车科技品牌smart,携手2021百度AI营销创想华为nova9Pro手机,鸿蒙多机位模式就是YYDS现如今,如果你说你不会玩Vlog,那肯定会有人会说你被时代淘汰了,现在的人无论是社交,旅行娱乐,甚至学习都会发个视频来找一下存在感,这也是为什么这款华为nova9Pro受欢迎的原因