不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • GO基础

  • 面向对象

  • 并发编程

  • 常用库

  • 数据库操作

  • Beego框架

    • 01.Beego安装
    • 02.Beego创建项目
    • 03.获取参数传值
    • 04.路由
    • 05.模板基本使用
    • 06.Model封装公共方法
    • 07.Config参数配置
    • 08.Cookie
    • 09.Session
    • 10.日志模块
    • 11.上传文件
    • 12.GORM操作
    • 13.GORM查询
      • 01.GORM基本查询
        • 1.1 基本查询
        • 1.2 用主键检索
      • 02.条件查询
        • 2.1 String 条件
        • 2.2 Struch & Map 查询
        • 2.3 Not条件
        • 2.4 Or条件
      • 03.高级查询
        • 3.1 选择特定字段
        • 3.2 Order
        • 3.3 Limit & Offset
        • 3.4 Group & Having
        • 3.5 Distinct
      • 04.连表查询
        • 4.1 Joins
        • 4.2 Joins 预加载
    • 14.GORM 关联查询
    • 15.GORM原生SQL
  • Beego商城

  • GIN框架

  • GIN论坛

  • 微服务

  • 设计模式

  • Go
  • Beego框架
xiaonaiqiang
2021-05-25
目录

13.GORM查询

# 01.GORM基本查询

  • 官方文档 (opens new window)

# 1.1 基本查询

func (c *UserController) UserSelect() {
	//1、查询id=3的用户
	user := models.User{Id: 3}
	models.DB.Find(&user)

	//2、查询所有数据
	user := []models.User{}
	result := models.DB.Find(&user)  //5 (统计有几条数据)
	fmt.Println(result.RowsAffected )
    
	//3、查询第一条数据
	users := models.User{}
	models.DB.First(&users)
    
	c.Data["json"] = user
	c.ServeJSON()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 1.2 用主键检索

func (c *UserController) UserSelect() {
	user := []models.User{}

	//1) SELECT * FROM users WHERE id = 2;
	models.DB.First(&user, 2)
	//2) SELECT * FROM users WHERE id IN (1,2,3);
	models.DB.Find(&user, []int{1,2,3})

	c.Data["json"] = user
	c.ServeJSON()
}
1
2
3
4
5
6
7
8
9
10
11

# 02.条件查询

# 2.1 String 条件

func (c *UserController) UserSelect() {
	user := []models.User{}

	//1) Get first matched record
	models.DB.Where("username = ?", "zhangsan").First(&user)
	// SELECT * FROM users WHERE name = 'jinzhu' limit 1;

	//2) Get all matched records
	models.DB.Where("username = ?", "zhangsan").Find(&user)
	// SELECT * FROM users WHERE name = 'jinzhu';

	//3) <>
	models.DB.Where("username <> ?", "jinzhu").Find(&user)
	//SELECT * FROM users WHERE name <> 'jinzhu';

	//4) IN
	models.DB.Where("username IN (?)", []string{"jinzhu", "jinzhu 2"}).Find(&user)
	//5) SELECT * FROM users WHERE name in ('jinzhu','jinzhu 2');

	//6) LIKE
	models.DB.Where("username LIKE ?", "%jin%").Find(&user)
	// SELECT * FROM users WHERE name LIKE '%jin%';

	//7) AND
	models.DB.Where("username = ? AND age >= ?", "jinzhu", "22").Find(&user)
	// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 22;

	//8) Time
	models.DB.Where("updated_at > ?", lastWeek).Find(&user)
	// SELECT * FROM users WHERE updated_at > '2000-01-01 00:00:00';

	//9) BETWEEN
	models.DB.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&user)
	// SELECT * FROM users WHERE created_at BETWEEN '2000-01-01 00:00:00' AND '2000-01-08 00:00:00';

	c.Data["json"] = user
	c.ServeJSON()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 2.2 Struch & Map 查询

func (c *UserController) UserSelect() {
	user := []models.User{}

	// 1)Struct
	models.DB.Where(&models.User{Username: "zhangsan", Age: 26}).First(&user)
	// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;

	// 2)Map
	models.DB.Where(map[string]interface{}{"username": "zhangsan", "age": 26}).Find(&user)
	// SELECT * FROM users WHERE name = "jinzhu" AND age = 20;

	// 3)主键的切片
	models.DB.Where([]int64{1, 2, 3}).Find(&user)
	//SELECT * FROM users WHERE id IN (20, 21, 22);

	c.Data["json"] = user
	c.ServeJSON()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 定义的结构体
type User struct {
	Id       int
	Username string
	Age      int
	Email    string
	AddTime  int
}
1
2
3
4
5
6
7

# 2.3 Not条件

func (c *UserController) UserSelect() {
	user := []models.User{}

	//1)不等于
	models.DB.Not("zhangsan", "lisi").First(&user)
	// SELECT * FROM users WHERE name <> "jinzhu" LIMIT 1;

	//2) Not In
	models.DB.Not("username", []string{"zhangsan", "lisi"}).Find(&user)
	//// SELECT * FROM users WHERE name NOT IN ("jinzhu", "jinzhu 2");

	//3) Not In slice of primary keys
	models.DB.Not([]int64{1,2,3}).First(&user)
	// SELECT * FROM users WHERE id NOT IN (1,2,3);
	
	//4) Plain SQL
	models.DB.Not("name = ?", "jinzhu").First(&user)
	// SELECT * FROM users WHERE NOT(name = "jinzhu");

	//5) Struct
	models.DB.Not(models.User{Username: "jinzhu"}).First(&user)
	// SELECT * FROM users WHERE name <> "jinzhu";

	c.Data["json"] = user
	c.ServeJSON()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 2.4 Or条件

func (c *UserController) UserSelect() {
	user := []models.User{}
	
	//1)
	models.DB.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&user)
	// SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin';

	//2) Struct
	models.DB.Where("name = 'jinzhu'").Or(models.User{Username: "jinzhu 2"}).Find(&user)
	// SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';

	//3) Map
	models.DB.Where("name = 'jinzhu'").Or(map[string]interface{}{"name": "jinzhu 2"}).Find(&user)
	// SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';
	
	c.Data["json"] = user
	c.ServeJSON()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 03.高级查询

# 3.1 选择特定字段

  • 选择您想从数据库中检索的字段,默认情况下会选择全部字段
db.Select("name", "age").Find(&users)
// SELECT name, age FROM users;

db.Select([]string{"name", "age"}).Find(&users)
// SELECT name, age FROM users;

db.Table("users").Select("COALESCE(age,?)", 42).Rows()
// SELECT COALESCE(age,'42') FROM users;
1
2
3
4
5
6
7
8

# 3.2 Order

  • 指定从数据库检索记录时的排序方式
db.Order("age desc, name").Find(&users)
// SELECT * FROM users ORDER BY age desc, name;

// 多个 order
db.Order("age desc").Order("name").Find(&users)
// SELECT * FROM users ORDER BY age desc, name;

db.Clauses(clause.OrderBy{
  Expression: clause.Expr{SQL: "FIELD(id,?)", Vars: []interface{}{[]int{1, 2, 3}}, WithoutParentheses: true},
}).Find(&User{})
// SELECT * FROM users ORDER BY FIELD(id,1,2,3)
1
2
3
4
5
6
7
8
9
10
11

# 3.3 Limit & Offset

db.Limit(3).Find(&users)
// SELECT * FROM users LIMIT 3;

// 通过 -1 消除 Limit 条件
db.Limit(10).Find(&users1).Limit(-1).Find(&users2)
// SELECT * FROM users LIMIT 10; (users1)
// SELECT * FROM users; (users2)

db.Offset(3).Find(&users)
// SELECT * FROM users OFFSET 3;

db.Limit(10).Offset(5).Find(&users)
// SELECT * FROM users OFFSET 5 LIMIT 10;

// 通过 -1 消除 Offset 条件
db.Offset(10).Find(&users1).Offset(-1).Find(&users2)
// SELECT * FROM users OFFSET 10; (users1)
// SELECT * FROM users; (users2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 3.4 Group & Having

type result struct {
  Date  time.Time
  Total int
}

db.Model(&User{}).Select("name, sum(age) as total").Where("name LIKE ?", "group%").Group("name").First(&result)
// SELECT name, sum(age) as total FROM `users` WHERE name LIKE "group%" GROUP BY `name`


db.Model(&User{}).Select("name, sum(age) as total").Group("name").Having("name = ?", "group").Find(&result)
// SELECT name, sum(age) as total FROM `users` GROUP BY `name` HAVING name = "group"

rows, err := db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Rows()
for rows.Next() {
  ...
}

rows, err := db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Having("sum(amount) > ?", 100).Rows()
for rows.Next() {
  ...
}

type Result struct {
  Date  time.Time
  Total int64
}
db.Table("orders").Select("date(created_at) as date, sum(amount) as total").Group("date(created_at)").Having("sum(amount) > ?", 100).Scan(&results)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 3.5 Distinct

db.Distinct("name", "age").Order("name, age desc").Find(&results)
1

# 04.连表查询

# 4.1 Joins

type result struct {
  Name  string
  Email string
}
db.Model(&User{}).Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Scan(&result{})
// SELECT users.name, emails.email FROM `users` left join emails on emails.user_id = users.id

rows, err := db.Table("users").Select("users.name, emails.email").Joins("left join emails on emails.user_id = users.id").Rows()
for rows.Next() {
  ...
}

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

# 4.2 Joins 预加载

  • 您可以使用 Joins 实现单条 SQL 预加载关联记录,例如:
db.Joins("Company").Find(&users)
// SELECT `users`.`id`,`users`.`name`,`users`.`age`,`Company`.`id` AS `Company__id`,`Company`.`name` AS `Company__name` FROM `users` LEFT JOIN `companies` AS `Company` ON `users`.`company_id` = `Company`.`id`;
1
2
上次更新: 2024/3/13 15:35:10
12.GORM操作
14.GORM 关联查询

← 12.GORM操作 14.GORM 关联查询→

最近更新
01
04.数组双指针排序_子数组
03-25
02
08.动态规划
03-25
03
06.回溯算法
03-25
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式