前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gorm之CURD-查询篇

gorm之CURD-查询篇

作者头像
大话swift
发布2020-03-26 17:42:08
8910
发布2020-03-26 17:42:08
举报
文章被收录于专栏:大话swift大话swift

现在的互联网产品早已经和数据库紧密的结合在了一起,后端每天都要和数据库打交道,而且更多的时候是进行查询操作,可以说互联网产品绝大多数时间都是在查询。这篇文章我们主要讲解一下gorm的查询操作,例如:如何使用where条件进行查询;如何使用like条件进行查询;如何使用in条件进行查询。我会把各种情况下的SQL给大家贴出来,在这里我总结了一下查询的技巧,帮大家采坑,希望对大家学习工作有帮助。

这里主要介绍了一下查询方法

  1. where
  2. first
  3. last
  4. like
  5. count
  6. having
  7. not
  8. between ... and
代码语言:javascript
复制
type User struct {
  Model
  Name   string
  Gender uint8
}
代码语言:javascript
复制
package main

import (
  "ginLearn.com/models"
)

func main() {
  db := models.DB()
  user := models.User{}
  var userSlice []models.User
  //查询id为1的用户 正序
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 1 AND ((`users`.`id` = 1)) ORDER BY `users`.`id` ASC LIMIT 1
  db.First(&user, 1)
  //查询id为1的最后一位用户 逆序
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 2 AND ((`users`.`id` = 1)) ORDER BY `users`.`id` DESC LIMIT 1
  db.Last(&user, 1)

  //Where 条件查询

  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((name='hanyun'))
  db.Where("name=?", "hanyun").Find(&userSlice)
  //相等
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((name='hanyun')) ORDER BY `users`.`id` ASC LIMIT 1
  db.Where("name=?", "hanyun").First(&user)

  //不等
  // SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((name<>'hanyun'))
  db.Where("name<>?", "hanyun").Find(&userSlice)

  //like
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((name like'%h%'))
  db.Where("name like?", "%h%").Find(&userSlice)

  //and
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((name like'%h%' and gender=1))
  db.Where("name like? and gender=?", "%h%", 1).Find(&userSlice)

  //between and
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((created_at between '2020-03-16 11:35:18' and '2020-03-17 17:40:55'))
  db.Where("created_at between ? and ?", "2020-03-16 11:35:18", "2020-03-17 17:40:55").Find(&userSlice)

  //Struct & Map
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((`users`.`name` = 'hanyun'))
  db.Where(&models.User{Name: "hanyun"}).Find(&userSlice)

  //为什么?当通过结构体进行查询时,GORM将会只通过非零值字段查询,这意味着如果你的字段值为0,'', false 或者其他 零值时,将不会被用于构建查询条件
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL
  db.Where(&models.User{Gender: 0}).Find(&userSlice)
  // SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((`users`.`Gender` = 0))
  db.Where(map[string]interface{}{"Gender": 0}).Find(&userSlice)

  // in
  //数值的切片会被当做主键进行查询
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((`users`.`id` IN (8,9)))
  db.Where([]int{8, 9}).Find(&userSlice)

  // not in
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((`users`.`id` NOT IN (8,9)))
  db.Not([]int{8, 9}).Find(&userSlice)

  //or查询
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((`users`.`id` IN (8,9)) OR (`users`.`Gender` = 0))
  db.Where([]int{8, 9}).Or(map[string]interface{}{"Gender": 0}).Find(&userSlice)

  //选择字段
  //SELECT name,gender FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((`users`.`id` IN (8,9)))
  db.Select("name,gender").Where([]int{8, 9}).Find(&userSlice)
  //SELECT name, gender FROM `users`  WHERE `users`.`deleted_at` IS NULL AND ((`users`.`id` IN (8,9)))
  db.Select([]string{"name", "gender"}).Where([]int{8, 9}).Find(&userSlice)

  //排序 order
  //单一字段排序
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL ORDER BY name desc
  db.Order("name desc").Find(&userSlice)
  //多字段排序
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL ORDER BY name desc,id asc
  db.Order("name desc,id asc").Find(&userSlice)

  //数量限制
  // SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL LIMIT 1
  db.Limit(1).Find(&userSlice)
  //取消数量限制
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL
  db.Limit(1).Limit(-1).Find(&userSlice)

  //偏移
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL LIMIT 1 OFFSET 2
  db.Limit(1).Offset(2).Find(&userSlice)
  //取消偏移
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL LIMIT 1
  db.Limit(1).Offset(2).Offset(-1).Find(&userSlice)

  //总数
  count := 0
  //SELECT count(*) FROM `users`  WHERE `users`.`deleted_at` IS NULL
  db.Find(&userSlice).Count(&count)

  //查询的综合运用,包含了分页
  //SELECT * FROM `users`  WHERE `users`.`deleted_at` IS NULL LIMIT 1 OFFSET 1
  //SELECT count(*) FROM `users`  WHERE `users`.`deleted_at` IS NULL
  db.Offset(1).Limit(1).Find(&userSlice).Limit(-1).Offset(-1).Count(&count)

  //group
  //SELECT name FROM `users`  WHERE `users`.`deleted_at` IS NULL GROUP BY name
  db.Select("name").Group("name").Find(&userSlice)
  //Having
  //SELECT count(name) c FROM `users`  WHERE `users`.`deleted_at` IS NULL GROUP BY name HAVING (c>1)
  db.Select("count(name) c").Group("name").Having("c>?", 1).Find(&userSlice)
}

读懂的小伙伴可以试一下看看能不能写出下面的代码的SQL

代码语言:javascript
复制
  count := 0
  var userSlice []models.User
  db.Offset(1).Limit(1).Find(&userSlice).Limit(-1).Offset(-1).Count(&count)

链接:https://pan.baidu.com/s/12sOSADvQIjQqAJAko1L2gg

提取码:r7pp

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档