GORM V2 读操作
01 概念
在项目开发中,大多数项目都是读多写少,关于使用 GORM 读取 MySQL,我们单独一篇文章讲述 GORM 是如何使读操作更加便捷的。
02 单条查询
关于单条查询,GORM 提供了三个方法,分别是 First、Last 和 Take,其中 First 和 Last 是根据主键升序和降序,使用 Limit 1 获取 1 条记录。Take 方法未指定排序字段,使用 Limit 1获取 1 条记录,排序规则根据数据库的实现。
其中 First 和 Last 仅在通过 struct 和给定 Model 值进行查询时才有效,但是 Take 方法不受此限制。
示例代码:
First 方法:
student := Student{}
gormDB.First(&student)
fmt.Println(student)
Take 方法:
student := Student{}
gormDB.Take(&student)
fmt.Println(student)
Last 方法:
student := Student{}
result := gormDB.Last(&student)
fmt.Println(student)
03查询所有
关于查询所有记录,GORM 提供了 Find 方法,获取全部记录。
示例代码:
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 条件:
student := Student{}
gormDB.Where("name = ?", "bear").First(&student)
fmt.Println(student)
var students []Student
gormDB.Where("name <> ?", "bear").Find(&students)
fmt.Println(students)
var students []Student
gormDB.Where("name IN ?", []string{"bear", "panda"}).Find(&students)
fmt.Println(students)
var students []Student
gormDB.Where("name LIKE ?", "%a%").Find(&students)
fmt.Println(students)
var students []Student
gormDB.Where("name = ? AND age > ?", "coco", 18).Find(&students)
fmt.Println(students)
var students []Student
lastWeek := time.Now().Add(time.Hour*24*-7)
gormDB.Where("updated_at > ?", lastWeek).Find(&students)
fmt.Println(students)
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 条件:
var student Student
gormDB.Where(&Student{Name: "coco", Age: 19}).Find(&student)
fmt.Println(student)
Map 条件:
var student Student
gormDB.Where(map[string]interface{}{"name": "coco", "age": 19}).Find(&student)
fmt.Println(student)
主键 Slice 条件:
var students []Student
gormDB.Where([]int{15,16,17}).Find(&students)
fmt.Println(students)
Not 方法: 普通 Not 条件:
var student Student
gormDB.Not("name = ?", "cat").First(&student)
fmt.Println(student)
Not In:
var students []Student
gormDB.Not(map[string]interface{}{"id":[]int{15,17}}).Find(&students)
fmt.Println(students)
Struct:
var student Student
gormDB.Not(Student{Name: "cat", Age: 18}).Find(&student)
fmt.Println(student)
主键 Slice:
var students []Student
gormDB.Not([]int{1,2,3,15,16}).Find(&students)
fmt.Println(students)
Or 方法:
普通 Or:
var students []Student
gormDB.Where("name = ?", "cat").Or("name = ?", "cat2").Find(&students)
fmt.Println(students)
Struct:
var students []Student
gormDB.Where("name = ?", "cat2").Or(Student{Name: "cat", Age: 19}).Find(&students)
fmt.Println(students)
Map:
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 方法,可以方便我们指定字段查询。
示例代码:
普通方式:
var students []Student
gormDB.Select("name", "age").Find(&students)
fmt.Println(students)
Slice 方式:
var students []Student
gormDB.Select([]string{"name", "age"}).Find(&students)
fmt.Println(students)
06 order 排序
在许多业务场景中,查询都需要用到排序,GORM 提供了 Order 方法,实现对结果集的排序功能。
示例代码:
普通方式:
var students []Student
gormDB.Order("id desc, age").Find(&students)
fmt.Println(students)
多个排序字段:
var students []Student
gormDB.Order("id desc").Order("age").Find(&students)
fmt.Println(students)
07 Limit & Offset
查询操作中,在某些业务场景中,需要限制查询的条数,和偏移查询记录的开始位置。针对此类业务场景,GORM 提供了 Limit 和 Offset 方法。
示例代码:
var students []Student
gormDB.Limit(5).Offset(1).Find(&students)
fmt.Println(students)
关于 GORM 的查询操作,还有一些其它高级用法,限于篇幅原因,不再一一列举,如有兴趣,可以通过查询 GORM 官方文档了解。
- 网页爬虫-R语言实现基本函数
- Python中的random模块用于生成随机数
- 简单易学的机器学习算法——极限学习机(ELM)
- 图片数据集太少?Keras Image Data Augmentation 各参数详解
- 备库归档删除策略失效的问题分析 (r7笔记第6天)
- 优化算法——梯度下降法
- Java基础-26(02)总结网络编程
- 记一次数据同步需求的改进(二) (r7笔记第5天)
- Python信贷数据处理与初步分析(ZIP解压)
- web前端之锋利的jQuery八:jQuery插件的使用(表单验证、表单提交)
- 优化算法——牛顿法(Newton Method)
- merge语句导致的CPU使用率过高的优化(r7笔记第4天)
- 由dual导致的一个潜在的监控问题(r7笔记第3天)
- 剑指Offer——编程题的Java实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++入门指南及实战 第二步 HelloWorld及扩展详解
- 依托于GitLab持续集成基础配置和使用
- C++入门指南及实战 第三步 基本变量
- 最全总结 | 聊聊 Python 数据处理全家桶(配置篇)
- FlexSDK工具包的介绍与编译使用
- 《零基础看得懂的C语言入门教程 》——(二)C语言没那么难简单开发带你了解流程
- Ansible自动化运维学习笔记5
- Ansible自动化运维学习笔记4
- 《零基础看得懂的C语言入门教程 》——(三)轻轻松松理解第一个C语言程序
- Python自动化运维2
- AirTest 基本使用及框架浅剖析——五分钟上手制作游戏辅助
- 【面试题】734- 从一道面试题谈谈对 EventLoop 的理解
- (上)python3 selenium3 从框架实现代码学习selenium让你事半功倍
- (下)python3 selenium3 从框架实现代码学习selenium让你事半功倍
- 【Vuejs】738- 一篇文章上手Vue3中新增的API