前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GORM V2 读操作

GORM V2 读操作

作者头像
frank.
发布2020-09-18 19:39:29
1.6K0
发布2020-09-18 19:39:29
举报
文章被收录于专栏:Golang语言开发栈

01 概念

在项目开发中,大多数项目都是读多写少,关于使用 GORM 读取 MySQL,我们单独一篇文章讲述 GORM 是如何使读操作更加便捷的。

02 单条查询

关于单条查询,GORM 提供了三个方法,分别是 First、Last 和 Take,其中 First 和 Last 是根据主键升序和降序,使用 Limit 1 获取 1 条记录。Take 方法未指定排序字段,使用 Limit 1获取 1 条记录,排序规则根据数据库的实现。

其中 First 和 Last 仅在通过 struct 和给定 Model 值进行查询时才有效,但是 Take 方法不受此限制。

示例代码:

First 方法:

代码语言:javascript
复制
student := Student{}
gormDB.First(&student)
fmt.Println(student)

Take 方法:

代码语言:javascript
复制
student := Student{}
gormDB.Take(&student)
fmt.Println(student)

Last 方法:

代码语言:javascript
复制
student := Student{}
result := gormDB.Last(&student)
fmt.Println(student)

03查询所有

关于查询所有记录,GORM 提供了 Find 方法,获取全部记录。

示例代码:

代码语言:javascript
复制
var students  []Student
result := gormDB.Find(&students)
fmt.Println(students)

04 条件查询

关于条件查询,GORM 提供了 Where、Not 和 Or 方法。其中 Where 方法分别可以通过使用 String 条件、Struct 条件、Map 条件和主键 Slice 条件。

需要特别注意的是,当使用 Struct 条件时,GORM 只会查询非零值字段,也就是说如果你的字段是该字段类型的零值,将不会被用于构建查询条件。如果需要使用零值构建查询条件,可以使用 Map 构建查询条件。

示例代码:

Where 方法

String 条件:

代码语言:javascript
复制
student := Student{}
gormDB.Where("name = ?", "bear").First(&student)
fmt.Println(student)
代码语言:javascript
复制
var students []Student
gormDB.Where("name <> ?", "bear").Find(&students)
fmt.Println(students)
代码语言:javascript
复制
var students []Student
gormDB.Where("name IN ?", []string{"bear", "panda"}).Find(&students)
fmt.Println(students)
代码语言:javascript
复制
var students []Student
gormDB.Where("name LIKE ?", "%a%").Find(&students)
fmt.Println(students)
代码语言:javascript
复制
var students []Student
gormDB.Where("name = ? AND age > ?", "coco", 18).Find(&students)
fmt.Println(students)
代码语言:javascript
复制
var students []Student
lastWeek := time.Now().Add(time.Hour*24*-7)
gormDB.Where("updated_at > ?", lastWeek).Find(&students)
fmt.Println(students)
代码语言:javascript
复制
var students []Student
lastWeek := time.Now().Add(time.Hour*24*-7)
today := time.Now()
gormDB.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&students)
fmt.Println(students)

Struct 条件:

代码语言:javascript
复制
var student Student
gormDB.Where(&Student{Name: "coco", Age: 19}).Find(&student)
fmt.Println(student)

Map 条件:

代码语言:javascript
复制
var student Student
gormDB.Where(map[string]interface{}{"name": "coco", "age": 19}).Find(&student)
fmt.Println(student)

主键 Slice 条件:

代码语言:javascript
复制
var students []Student
gormDB.Where([]int{15,16,17}).Find(&students)
fmt.Println(students)

Not 方法: 普通 Not 条件:

代码语言:javascript
复制
var student Student
gormDB.Not("name = ?", "cat").First(&student)
fmt.Println(student)

Not In:

代码语言:javascript
复制
var students []Student
gormDB.Not(map[string]interface{}{"id":[]int{15,17}}).Find(&students)
fmt.Println(students)

Struct:

代码语言:javascript
复制
var student Student
gormDB.Not(Student{Name: "cat", Age: 18}).Find(&student)
fmt.Println(student)

主键 Slice:

代码语言:javascript
复制
var students []Student
gormDB.Not([]int{1,2,3,15,16}).Find(&students)
fmt.Println(students)

Or 方法:

普通 Or:

代码语言:javascript
复制
var students []Student
gormDB.Where("name = ?", "cat").Or("name = ?", "cat2").Find(&students)
fmt.Println(students)

Struct:

代码语言:javascript
复制
var students []Student
gormDB.Where("name = ?", "cat2").Or(Student{Name: "cat", Age: 19}).Find(&students)
fmt.Println(students)

Map:

代码语言:javascript
复制
var students []Student
gormDB.Where("name = ?", "cat2").Or(map[string]interface{}{"name":"cat", "age":19}).Find(&students)
fmt.Println(students)

05 指定字段查询

仔细的读者可能已经发现,上述的查询,全部都是查询数据库表的所有字段,这在 MySQL 查询优化上是大忌。使用 GORM 怎么指定字段查询呢?GORM 提供了一个 Select 方法,可以方便我们指定字段查询。

示例代码:

普通方式:

代码语言:javascript
复制
var students []Student
gormDB.Select("name", "age").Find(&students)
fmt.Println(students)

Slice 方式:

代码语言:javascript
复制
var students []Student
gormDB.Select([]string{"name", "age"}).Find(&students)
fmt.Println(students)

06 order 排序

在许多业务场景中,查询都需要用到排序,GORM 提供了 Order 方法,实现对结果集的排序功能。

示例代码:

普通方式:

代码语言:javascript
复制
var students []Student
gormDB.Order("id desc, age").Find(&students)
fmt.Println(students)

多个排序字段:

代码语言:javascript
复制
var students []Student
gormDB.Order("id desc").Order("age").Find(&students)
fmt.Println(students)

07 Limit & Offset

查询操作中,在某些业务场景中,需要限制查询的条数,和偏移查询记录的开始位置。针对此类业务场景,GORM 提供了 Limit 和 Offset 方法。

示例代码:

代码语言:javascript
复制
var students []Student
gormDB.Limit(5).Offset(1).Find(&students)
fmt.Println(students)

关于 GORM 的查询操作,还有一些其它高级用法,限于篇幅原因,不再一一列举,如有兴趣,可以通过查询 GORM 官方文档了解。

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

本文分享自 Go语言开发栈 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01 概念
  • 02 单条查询
  • 03查询所有
  • 04 条件查询
  • 05 指定字段查询
  • 06 order 排序
  • 07 Limit & Offset
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档