go语言Gin框架的学习路线(十)

目录

GORM的CRUD教程

查询

普通查询

定义 User 结构体

查询所有用户

查询第一个用户

总结

条件查询

内联条件

额外查询选项

高级查询

链式操作

Scopes

多个立即执行方法


GORM的CRUD教程

CRUD 是 "Create, Read, Update, Delete"(创建、查询、更新、删除)的缩写,代表了数据库操作的基本功能。在 GORM 的上下文中,CRUD 指的是使用 GORM 库来执行这些基本的数据库操作。

查询

以下是 GORM 进行不同查询操作的一些示例代码,包括普通查询、条件查询、高级查询等

普通查询

// 假设我们有一个User结构体
type User struct {gorm.ModelName stringAge  int
}// 查询所有用户
var users []User
db.Find(&users)// 查询第一个用户
var firstUser User
db.First(&firstUser)

定义 User 结构体

首先定义了一个 User 结构体,它将映射到数据库中的一个表。gorm.Model 是 GORM 内置的,它包含了一些基本的字段,如 ID(主键)、CreatedAt(记录创建时间)、UpdatedAt(记录更新时间)和 DeletedAt(软删除时间)。

查询所有用户

使用 db.Find(&users) 方法来查询数据库中所有的 User 记录。

  • db 是一个 *gorm.DB 类型的变量,它代表了数据库的连接。
  • Find 方法用于检索数据库中的记录。
  • &users 是一个指向 User 类型切片的指针。GORM 会将查询到的所有用户记录填充到这个切片中。

查询第一个用户

使用 db.First(&firstUser) 方法来查询数据库中的第一个 User 记录。

  • First 方法用于检索数据库中的第一个记录。
  • &firstUser 是一个指向 User 结构体的指针。GORM 会将查询到的第一个用户记录填充到这个结构体中。

总结

这段代码演示了如何使用 GORM 来执行基本的数据库查询操作。Find 方法用于获取所有记录,而 First 方法用于获取第一个记录。在实际开发中,还需要考虑错误处理和可能的空值检查。

条件查询

// 使用Where查询
var users []User
db.Where("age > ?", 18).Find(&users) // 年龄大于18的用户// 使用Not条件
db.Not("age = ?", 18).Find(&users) // 年龄不等于18的用户// 使用Or条件
db.Where("age > ?", 18).Or("name = ?", "Alice").Find(&users) // 年龄大于18或名字为Alice的用户

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

  1. db.Where("age > ?", 18).Find(&users):这行代码表示从数据库中查找年龄大于18的用户,并将结果存储在users切片中。?是一个占位符,它将被后面的参数(这里是18)替换。

  2. db.Not("age = ?", 18).Find(&users)这行代码表示从数据库中查找年龄不等于18的用户,并将结果存储在users切片中。Not方法用于添加一个否定条件,即排除满足指定条件的记录。

  3. db.Where("age > ?", 18).Or("name = ?", "Alice").Find(&users):这行代码表示从数据库中查找年龄大于18或者名字为"Alice"的用户,并将结果存储在users切片中。Or方法用于添加一个或条件,即满足任一条件的记录都会被选中。

注意:在实际使用中,你需要确保已经正确配置了数据库连接,并且User结构体与数据库中的表结构相匹配。

内联条件

// 内联条件
db.Where("age > ? AND name = ?", 18, "Alice").Find(&users)

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

db.Where("age > ? AND name = ?", 18, "Alice").Find(&users):这行代码表示从数据库中查找年龄大于18且名字为"Alice"的用户,并将结果存储在users切片中。?是一个占位符,它将被后面的参数(这里是18和"Alice")替换。

在这个例子中,Where方法用于添加一个条件,即年龄大于18且名字等于"Alice"。AND关键字用于连接两个条件,确保同时满足这两个条件的记录才会被选中。Find方法用于执行查询并将结果填充到指定的变量(这里是users切片)。

 

额外查询选项

// FirstOrInit
var user User
db.FirstOrInit(&user, User{Name: "Alice"}) // 如果不存在则初始化// Attrs
db.First(&user, "id = ?", 1)
db.Attrs(User{Name: "Bob"}).First(&user) // 将参数赋值给user// FirstOrCreate
db.FirstOrCreate(&user, User{Name: "Alice"}) // 如果不存在则创建

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

  1. db.FirstOrInit(&user, User{Name: "Alice"})这行代码表示从数据库中查找第一个名字为"Alice"的用户,并将结果存储在user变量中。如果不存在这样的用户,则将user初始化为一个新的User实例,其Name字段设置为"Alice"。

  2. db.Attrs(User{Name: "Bob"}).First(&user)这行代码表示从数据库中查找第一个满足条件的记录,并将其赋值给user变量。条件是通过Attrs方法指定的,即Name字段等于"Bob"。

  3. db.FirstOrCreate(&user, User{Name: "Alice"})这行代码表示从数据库中查找第一个名字为"Alice"的用户,并将结果存储在user变量中。如果不存在这样的用户,则创建一个新的用户,其Name字段设置为"Alice",并将新创建的用户赋值给user变量。

 

高级查询

// 子查询
var users []User
db.Where("age = (?)", db.Table("users").Select("MAX(age)")).Find(&users)// Select
db.Select("name, age").Find(&users) // 只选择name和age字段// Order
db.Order("age desc").Find(&users) // 按年龄降序// Limit
db.Limit(10).Find(&users) // 限制结果为10条// Offset
db.Offset(20).Find(&users) // 从第21条记录开始// Count
var count int64
db.Model(&User{}).Count(&count)// Group & Having
db.Group("age").Having("COUNT(*) > ?", 1).Find(&users)// Joins
db.Table("users as u join profiles as p on u.id = p.user_id").Select("u.*, p.data").Scan(&users)// Pluck
var ages []int
db.Pluck("age", &ages)// Scan
var result []map[string]interface{}
db.Table("users").Select("name, age").Scan(&result)

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

  1. db.Where("age = (?)", db.Table("users").Select("MAX(age)")).Find(&users)这行代码表示从数据库中查找年龄等于最大年龄的用户,并将结果存储在users切片中。子查询通过db.Table("users").Select("MAX(age)")实现,返回最大的年龄值。

  2. db.Select("name, age").Find(&users)这行代码表示从数据库中选择nameage字段,并将结果存储在users切片中。

  3. db.Order("age desc").Find(&users):这行代码表示按照年龄降序排列用户,并将结果存储在users切片中。

  4. db.Limit(10).Find(&users):这行代码表示限制查询结果为最多10条记录,并将结果存储在users切片中。

  5. db.Offset(20).Find(&users):这行代码表示从第21条记录开始查询,并将结果存储在users切片中。

  6. var count int64; db.Model(&User{}).Count(&count):这行代码表示计算User表中的记录数,并将结果存储在count变量中。

  7. db.Group("age").Having("COUNT(*) > ?", 1).Find(&users):这行代码表示按年龄分组,并筛选出年龄组中有超过1个用户的组,然后将这些组中的用户信息存储在users切片中。

  8. db.Table("users as u join profiles as p on u.id = p.user_id").Select("u.*, p.data").Scan(&users)这行代码表示执行一个连接查询,users表和profiles表连接起来,选择所有users表的字段以及profiles表的data字段,并将结果扫描到users切片中。

  9. var ages []int; db.Pluck("age", &ages):这行代码表示仅提取age字段的值,并将结果存储在ages切片中。

  10. var result []map[string]interface{}; db.Table("users").Select("name, age").Scan(&result)这行代码表示从users表中选择nameage字段,并将结果扫描到一个包含字符串键和接口值的映射切片中。

 

链式操作

db.Where("age > ?", 18).Order("age desc").Limit(10).Find(&users)

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

db.Where("age > ?", 18).Order("age desc").Limit(10).Find(&users):这行代码表示从数据库中查找年龄大于18的用户,并按照年龄降序排列,最后取前10条记录,并将结果存储在users切片中。

具体解释如下:

  • db.Where("age > ?", 18):这部分代码表示添加一个条件,即年龄大于18。?是一个占位符,它将被后面的参数(这里是18)替换。
  • Order("age desc"):这部分代码表示按照年龄字段降序排列结果。
  • Limit(10):这部分代码表示限制查询结果最多为10条记录。
  • Find(&users):这部分代码表示执行查询并将结果填充到指定的变量(这里是users切片)。

 

Scopes

// 定义一个Scope
func AgeAbove(age int) func(db *gorm.DB) *gorm.DB {return db.Where("age > ?", age)
}// 使用Scope
db.Scopes(AgeAbove(18)).Find(&users)

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

首先定义了一个名为AgeAbove的函数,该函数接受一个整数参数age,并返回一个闭包函数。这个闭包函数接受一个*gorm.DB类型的参数,表示一个GORM数据库连接实例,并返回一个同样类型的结果。在这个闭包函数中,使用了Where方法来添加一个条件,即年龄大于传入的age参数。

接下来,在调用db.Scopes(AgeAbove(18)).Find(&users)时,使用了Scopes方法来应用AgeAbove函数定义的条件。这里的AgeAbove(18)表示创建一个只查询年龄大于18岁的用户的条件。然后,通过链式调用Find方法来执行查询并将结果填充到users变量中。

总结一下,这段代码的作用是查询年龄大于18岁的用户,并将结果存储在users变量中。

 

多个立即执行方法

db.Where("age > ?", 18).Find(&users).Count(&count)

这段代码是使用Go语言和GORM库进行数据库查询的示例。GORM是一个用于Golang的开源对象关系映射(ORM)库,它允许开发者以更简洁的方式操作数据库。

db.Where("age > ?", 18).Find(&users):这部分代码表示添加一个条件,即年龄大于18岁,并执行查询将结果填充到users变量中。&users表示将查询结果存储在users切片中。

Count(&count):这部分代码表示计算满足条件的记录数,并将结果存储在count变量中。&count表示将计数结果存储在count变量中。

总结一下,这段代码的作用是查询年龄大于18岁的用户,并将结果存储在users切片中,同时计算满足条件的记录数,并将结果存储在count变量中。

 

请注意,这些示例代码假设你已经配置了 GORM 并连接到了数据库。你需要根据实际的数据库类型和配置来设置连接参数。此外,错误处理在实际应用中非常重要,应该根据需要进行适当的错误处理。

 期末放假自学Gin框架,希望我们可以一起学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/382291.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[经验] 驰这个汉字的拼音是什么 #学习方法#其他#媒体

驰这个汉字的拼音是什么 驰,是一个常见的汉字,其拼音为“ch”,音调为第四声。它既可以表示动词,也可以表示形容词或副词,意义广泛,经常出现在生活和工作中。下面就让我们一起来了解一下“驰”的含义和用法。…

以Zookeeper为例 浅谈脑裂与奇数节点问题

一、脑裂现象的定义与影响 脑裂(split-brain)是指在分布式系统中,因网络分区或其他故障导致系统被切割成两个或多个相互独立的子系统,每个子系统可能独立选举出自己的领导节点。这一现象在依赖中心领导节点(如Elastic…

【Qt 】JSON 数据格式详解

文章目录 1. JSON 有什么作用?2. JSON 的特点3. JSON 的两种数据格式3.1 JSON 数组3.2 JSON 对象 4. Qt 中如何使用 JSON 呢?4.1 QJsonObject4.2 QJsonArray4.3 QJsonValue4.4 QJsonDocument 5. 构建 JSON 字符串6. 解析 JSON 字符串 1. JSON 有什么作用? &#x…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十九章 Linux MISC驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

5.Fabric的共识机制

在Fabric中,有以下3中典型共识机制。 Solo共识 solo共识机制只能用于单节点模式,即只能有一个Orderer节点,因此,其共识过程很简单,每接收到一个交易信息,就在共识模块的控制下产生区块并广播给节点存储到账本中。 Solo 模式下的共识只适用于一个Orderer节点,所以可以在…

CTF-Web习题:2019强网杯 UPLOAD

题目链接:2019强网杯 UPLOAD 解题思路 打开靶场如下图所示,是一个注册和登录界面 那就注册登录一下,发现是一个提交头像的页面: 试了一下只有能正确显示的png图片才能提交成功,同时F12拿到cookie,base6…

便宜多域名SSL证书申请平台推荐

随着互联网的深入发展,网络安全问题愈发受到重视。SSL证书作为保障网站和用户数据安全的重要工具,其重要性不言而喻。在众多SSL证书类型中,多域名SSL证书因其独特的功能和优势,逐渐成为企业和个人保护网站安全的首选。 申请便宜S…

Django视图与URLs路由详解

在Django Web框架中,视图(Views)和URLs路由(URL routing)是Web应用开发的核心概念。它们共同负责将用户的请求映射到相应的Python函数,并返回适当的响应。本篇博客将深入探讨Django的视图和URLs路由系统&am…

全国区块链职业技能大赛国赛考题区块链产品需求分析与方案设计

任务1-1:区块链产品需求分析与方案设计 本任务需要依据项目背景完成需求分析与方案设计,具体要求如下: 依据给定区块链食品溯源系统的业务架构图,对考题进行业务分析,尽可能多的去考虑一个业务系统所需要的模块,使用Visio或思维导图工具展现本系统的基本设计概念和处理流…

科研绘图系列:R语言热图(heatmap)

介绍 热图是一种数据可视化技术,通常用于展示数据的分布情况。它通过颜色的变化来表示数据的大小或密度,使得观察者能够直观地理解数据集中的模式和趋势。以下是热图的一些关键特点和应用场景: 数据分布:热图可以显示数据在不同区域的分布情况,比如在地图上显示不同地区的…

Go基础编程 - 12 -流程控制

流程控制 1. 条件语句1.1. if...else 语句1.2. switch 语句1.3. select 语句1.3.1. select 语句的通信表达式1.3.2. select 的基特性1.3.3. select 的实现原理1.3.4. 经典用法1.3.4.1 超时控制1.3.4.2 多任务并发控制1.3.4.3 监听多通道消息1.3.4.4 default 实现非堵塞读写 2. …

GPT-4o mini是什么?

今天,全网都知道 OpenAI 发现货了! GPT-4o mini 取代 GPT 3.5,从此坐上正主之位。 从官网信息来看,OpenAI 最新推出的 GPT-4o mini 重新定义了 AI 成本效益的标准,其性能优于前代模型 GPT-3.5 Turbo,且成本…

查看公网IP的网络出口

文章目录 背景 背景 有时候在各种交易或其他时候,会被问到给我一个公网IP,我来帮你加白名单。 这个怎么怎么获取公网IP呢,在自己本机查看ipconfig或者ifconfig ip a 等命令查到的一般都是局域网的IP,每台机器都需要一个IP来进行对…

数学建模学习(111):改进遗传算法(引入模拟退火、轮盘赌和网格搜索)求解JSP问题

文章目录 一、车间调度问题1.1目前处理方法1.2简单案例 二、基于改进遗传算法求解车间调度2.1车间调度背景介绍2.2遗传算法介绍2.2.1基本流程2.2.2遗传算法的基本操作和公式2.2.3遗传算法的优势2.2.4遗传算法的不足 2.3讲解本文思路及代码2.4算法执行结果: 三、本文…

基于MobileNetv2的垃圾分类函数式自动微分-昇思25天打卡

基于MobileNetv2的垃圾分类 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写(Python语言)&a…

linux 网络子系统

__netif_receive_skb_core 是 Linux 内核网络子系统中一个非常重要的函数,它负责将网络设备驱动层接收到的数据包传递到上层协议栈进行处理。以下是对该函数的一些关键点的详细解析: 一、函数作用 __netif_receive_skb_core 函数是处理接收到的网络数据…

linux 解决端口占用

1.查询被占用的端口 netstat -tln | grep 60602.查询该端口对应的服务 lsof -i :60603.杀死该进程 //14868是第二步的PID kill -9 14868

ubuntu在命令行输出里查找内容,dmesg

直接执行查看日志指令会出来很多页。dmesg为开机日志信息。记录了开机时硬件的过程 sudo dmesg 执行结果: 可以用竖号“|”,在前一条命令返回的内容进行查找。下图为查找bluetooth sudo dmesg |grep -i bluetooth

算法-嵌套类递归解题套路

文章目录 理论基础 :1. 基本计算器2. 字符串解码3. 求原子数量 理论基础 : 嵌套类递归是指一种一个字符串形式的问题通过嵌套调用子函数从而求解出结果的一类问题, 解题方法相对来说比较的固定, 我们总结为下面的几部分 大概过程 : 定义全局变量where递归函数 f ( i ) : s [ i …