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.mzph.cn/bicheng/49469.shtml

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

相关文章

电影类平台如何选择服务器

电影类平台如何选择服务器 1、数据存储 电影网站对服务器的要求是比较高的,对存储空间的需求特别大,所以在服务器选择上首先要确保足够大的存储空间。另外,当你的网站内容特别多时,内存不够用,可以选择增加内存&#x…

AIoTedge边缘物联网平台,开启智能物联新架构

边缘物联网平台是一种将计算能力、数据处理和应用服务部署在网络边缘的解决方案,旨在提高响应速度、降低带宽需求和增强数据安全。根据搜索结果,边缘物联网平台应具备以下功能: 云边协同: 云边一体架构,通过云端管理边…

electron笔记:electron更新版本

一.electron版本由13.6.9更新至22.3.27 之前因为remote的原因,electron版本停留在13.6.9,14.x后需要单独处理remote,此次需要Chrome 95以上部分功能,所以需要升级版本到16.x以上,因为本机nodejs版本为16.9.1&#xff…

【深度学习基础】深度学习的关键概念和网络结构

深度学习基础:深度学习的关键概念和网络结构 目录 引言深度学习的关键概念 神经网络激活函数损失函数优化算法 深度学习的网络结构 前馈神经网络(FNN)卷积神经网络(CNN)循环神经网络(RNN)生成…

【java基础】创建线程的主要方式

在Java中创建线程主要有三种方式: 继承Thread类 这是最传统的创建线程的方式。你需要创建一个Thread类的子类,并重写run()方法。在run()方法中编写线程要执行的代码。然后,实例化这个子类并调用start()方法来启动线程。 class MyThread exten…

【BUG】已解决:Downgrade the protobuf package to 3.20.x or lower.

Downgrade the protobuf package to 3.20.x or lower. 目录 Downgrade the protobuf package to 3.20.x or lower. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身…

【昇腾AI创新大赛集训营南京站学习笔记】-Ascend算子开发课程

昇腾AI创新大赛训练营 14:00-14:30 基础知识-理论课 一、CANN 、达芬奇架构和算子 1.AI Core逻辑架构 达芬奇架构包含三部分: 1)计算类:矩阵计算单元(两个矩阵扔进去相乘)、向量计算单元、标量计算单元 2)控…

逻辑漏洞面试问题

1、你挖过业务逻辑漏洞吗?了解的有哪些?如何进行的?对于业务逻辑漏洞,只有一个登录框,你 会怎么测试?逻辑漏洞 xray 如何避免敏感操作? 常见的业务逻辑漏洞类型包括:订单支付漏洞、…

剑指offer的面试题,赋值运算符函数

class CMyString {public:CMyString(char*pDatanullptr);CMyString(const CMyString&str);~CMyString(void);private:char*m_pData;} 如上为类型Cmystring的声明,请为该类型添加赋值运算符函数。 class CMyString { public:CMyString(char* pData nullptr);CMy…

C#港澳台通行证识别接口、台胞证识别、ocr证件识别

在这个快节奏的时代,效率至上,每一秒都弥足珍贵。想象一下,无需手动输入繁琐的证件信息,仅需轻轻一扫,证面上所有文字信息便可呈现在眼前将是多么的便利,这得益于文字识别技术衍生下的-证件识别接口&#x…

基于单片机控制的变压器油压油温故障检测

摘 要 在电力系统的运行中,通过对其核心设备变压器的故障进行检测,以此能够及时、准确的发现变压器的故障,基于单片机控制的变压器油压油温的故障检测的方法,利用压力传感器、温度传感器对变压器的油压、油温进行采集并送入单片机…

vCenter 错误提示 “目标主机上的vmotion接口未配置”

vCenter 错误提示 “目标主机上的vmotion接口未配置” VMware 使用 vCenter 迁移 虚拟机报错 “目标主机上的 vMotion 接口未配置”,配置启用 vMotion 的步骤如下: (END)

【CentOS7】解决 CentOS 7 使用 `yum` 时出现的错误

解决 CentOS 7 使用 yum 时出现的错误 问题 在使用 yum 进行各种操作时(例如 Plesk 更新、系统更新、软件包安装等),可能会出现以下错误: Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86…

Spring Bean 循环依赖

在Spring框架中,Bean的创建和管理是其核心功能之一。然而,在复杂的应用系统中,Bean之间可能会形成循环依赖(Circular Dependency),这种情况如果不加以妥善处理,将会导致Spring容器在初始化时抛出…

leetcode3098. 求出所有子序列的能量和

官解 class Solution(object):# 定义常量mod int(1e9 7) # 模数,用于防止结果溢出inf float(inf) # 无穷大,用于初始化时的特殊值def sumOfPowers(self, nums, k):n len(nums) # 数组长度res 0 # 用于存储最终结果# 三维动态规划表,…

Nacos-2.4.0最新版本docker镜像,本人亲自制作,部署十分方便,兼容postgresql最新版本17和16,奉献给大家了

基于Postgresql数据库存储的nacos最新版本2.4.0,采用docker镜像安装方式 因业务需要,为了让nacos支持postgresql,特意花了两天时间修改了源码,然后制作了docker镜像,如果你也在找支持postgresql的nacos最新版本,恭喜你,你来的正好~ nacos-2.4.0 postgresql的数据库脚本…

C#中的new以及类

new关键字的用法 实例化对象:使用 new 关键字可以创建一个类的实例。例如: ​ MyClass obj new MyClass(); 指定构造函数:如果类有多个构造函数,可以使用 new 关键字指定使用哪一个构造函数来创建对象。例如: ​ MyC…

Apache SeaTunnel快速入门及原理和实践(一)

一、概述 主要从以下6个方面进行: 对数据集成做一个简单的概括对 SeaTunnel 做简单的介绍介绍 SeaTunnel 当前的原理和架构演进对当前市面上一些比较常见的数据集成工具进行对比,来解读一下现在市面上已经有了那么多数据集成工具,为什么我们…

Django Web框架——01

目录 文章目录 目录 Django框架的介绍起源&现状Django的安装 创建Django项目创建项目的指令Django项目的目录结构settings.py 文件介绍 URL 介绍URL定义Django如何处理一个URL对应的请求视图函数(view) Django 路由配置path() 函数path转换器 re_path()函数 HTTP协议的请求…

CoAP——Libcoap安装和使用(Ubuntu22.04)

1、简介 CoAP(Constrained Application Protocol)是一种专为受限设备和网络设计的应用层协议。它类似于HTTP,但具有更轻量级的特性,适合用于物联网(IoT)环境中的低功耗和低带宽设备。Libcoap是一个轻量级的…