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

news2024/11/15 13:39:27

目录

GORM的CRUD教程

查询

普通查询

定义 User 结构体

查询所有用户

查询第一个用户

总结

条件查询

内联条件

额外查询选项

高级查询

链式操作

Scopes

多个立即执行方法


GORM的CRUD教程

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

查询

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

普通查询

// 假设我们有一个User结构体
type User struct {
    gorm.Model
    Name string
    Age  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.coloradmin.cn/o/1944617.html

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

相关文章

数字图像处理中的常用特殊矩阵及MATLAB应用

一、前言 Matlab的名称来源于“矩阵实验室(Matrix Laboratory)”,其对矩阵的操作具有先天性的优势(特别是相对于C语言的数组来说)。在数字图像处理中,为了提高编程效率,我们可以使用多种方式来创…

【UIE模型-傻瓜式教程】飞桨AI Studio中fork实体抽取任务(打车、快递单)并运行教程

文章目录 fork项目环境与数据准备微调训练验证与测试 fork项目 环境与数据准备 安装paddlenlp(尽量装paddlenlp2.4.2,否则会报错!) 下载打车数据 转换数据格式,并划分训练集、验证集和测试集 微调训练 微调训练&#x…

WiFi通信——STM32通过ESP8266-01S与阿里云通信

嵌入式设计中常用的无线通信方式主要由蓝牙、WiFi、Zigbee、Lora、NB-IOT等等。这些是最常用的,也是在实际项目开发中根据项目的数据通信特点来选择相应的无线通信方式。本设计主要是讲解WiFi在嵌入式开发中的使用。 1. ESP8266-01S烧录固件 WiFi通信的频段和蓝牙一…

论文中的流程图参考图片

写论文的时候,在绘制流程图时,一直纠结n是大写还是小写,用不用斜体,号两边要不要空格。今天找到了一张标准的流程图来参考。图片来自 Zhi-Chang Ba et al, Combination of DCE-MRI and NME-DWI via Deep Neural Network for Predi…

学成在线开心学习

环境配置 第一章 项目介绍&环境搭建 项目背景 项目业务框架 项目技术架构 第二章 内容管理模块 本项目使用mybatis-plus的generator工程生成PO类、Mapper接口、Mapper的xml文件 模块工程 模型类的作用 课程查询接口 controller ApiOperation("课程查询接口&qu…

数字化就是要“用数字说话”运营,按“效果付费”经营

随着数字化技术的迅速发展,企业所处的市场环境发生了深刻的变革。在这个数字化转型时期,数据成为了企业决策的关键依据,“用数字说话”已成为企业运营的基本准则。而“效果付费”作为一种基于实际成果的商业模式,正逐渐受到企业经…

【QAC】Dashboard服务端如何配置

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决Dashboard服务端如何配置的问题。 2、 问题场景 客户想使用Dashboard,Dashboard服务端如何配置。 3、软硬件环境 1、软件版本:HelixQAC23.04 2、机器环境:Windows 64bit 3…

Linux_权限3

Linux所对应的文件类型 1.在Win下,有文件类型,通常通过后缀标识 日常用的就是windows系统这里不做举例. 2.Linux的文件类型不通过后缀区分(不代表Linux不用后缀) 其中需要注意的是第一个字符表示文件类型的含义 - :普通文件, 文本, 源代码…

AtCoder Beginner Contest 363(A~D题)

A - Piling Up 思路: 我们只需要找到下一阶段的下限。a / 100 是本阶段1 变成下一阶段&#xff0c;再 * 100变成下限&#xff0c;再与原来的相减即可。 代码: #include<bits/stdc.h> using namespace std; #define N 200010 typedef long long ll; typedef unsigned l…

Biomimetics 综述分享:肌电假肢手的交互操作控制综述

近些年假肢灵巧手成为了热点研究方向。此前有综述研究回顾了包括基于表面肌电信号的预测连续上肢运动的方法、基于表面肌电信号的多任务人机交互应用&#xff0c;以及肌电控制中的各种性能指标。近期&#xff0c;期刊Biomimetics&#xff08;JCR Q1&#xff09;发表了“面向肌电…

定时器+外部中断实现NEC红外线协议解码

一、前言 1.1 功能介绍 随着科技的进步和人们生活水平的提高&#xff0c;红外遥控器已经成为了日常生活中不可或缺的电子设备之一&#xff0c;广泛应用于电视、空调、音响等多种家电产品中。 传统的红外遥控器通常只能实现预设的有限功能&#xff0c;无法满足用户对设备更加智…

Mac 下华为鸿蒙 :DevEco Studio 开发工具下载

1.登录&#xff1a;华为开发者中心--开发--下载工具DevEco Studio 2.下载完成后 &#xff0c;安装&#xff0c;并创建一个新项目。 3.Tools --点击SDK Manager 下载SDK: 如果报&#xff1a;淘宝镜像源错误&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_H…

Threejs——辅助视图的旋转轴

官网的代码&#xff1a;link 实现这个效果 import {CylinderGeometry,CanvasTexture,Color,Euler,Mesh,MeshBasicMaterial,Object3D,OrthographicCamera,Quaternion,Raycaster,Sprite,SpriteMaterial,SRGBColorSpace,Vector2,Vector3,Vector4 } from three;class ViewHelper …

FP5207+音频功率放大器的组合解决方案-适用于便携式音频播放器、无线耳机、智能音箱和车载音响系统等高质量音频输出需求的产品,以提高电池供电的效率和输出功率

随着消费者对智能家居的需求增长&#xff0c;智能音响市场成为重要增长点。同时&#xff0c;音响技术也在不断发展&#xff0c;音响及扬声器的功能和性能不断提升。 蓝牙音箱&#xff0c;这类音箱供电是以锂电池为主&#xff0c;一般选用内置升压的音频功放芯片&#xff0c;音响…

Java聚合快递系统对接云洋系统快递小程序系统源码

&#x1f680; "聚合快递系统"无缝对接云洋系统&#xff0c;快递小程序新体验&#xff01;&#x1f4e6; &#x1f69a; 开篇&#xff1a;快递管理新纪元&#xff0c;一键接入云洋系统&#xff01; 你是否还在为繁琐的快递管理而头疼&#xff1f;多个快递公司账号切…

构建一个具有深色模式的简单React Web应用

在当今的Web开发世界里,创建一个既美观又功能丰富的用户界面是至关重要的。在本文中,我们将探讨如何使用React构建一个简单但功能强大的Web应用,它包含导航栏、内容展示区域和深色模式切换功能。 项目概述 我们的目标是创建一个具有以下特性的Web应用: 左侧导航栏,包含四个链…

JavaScript(12)——内置对象

JavaScript内部提供的对象&#xff0c;包含各种属性和方法给开发者调用。 Math Math对象是JavaScript提供的一个“数学”对象 包含的方法有&#xff1a; random:生成0-1之间的随机数 ceil&#xff1a;向上取整 floor&#xff1a;向下取整 max&#xff1a;找最大数 min&#…

Leetcode 721.账户合并(hash+dfs)☆

思路&#xff1a; 最核心的地方在于如何合并&#xff1f;这里是通过具有相同的email进行账户的合并&#xff0c;这个相同的email类似于图中的共同节点将两个账户连接起来&#xff0c;所以将原来 账户名 -> 邮件1 邮件2.。。变成hash 邮件1 ->账户id1&#xff0c;账户id2…

2024年jupyter notebook如何复制单元格cell输出的图片

背景 之前使用jupyter notebook复制图片一直是正常&#xff0c;右键就行&#xff0c;可以找到复制图片或者另存为的选项。 但是最近重新安装了anaconda&#xff0c;发现jupyter notebook升级了&#xff0c;和原来的界面不一样了。 如果有一个图片&#xff0c;我们右键&#x…