Go语言中gin+gorm开发前端端分离博客时遇到的问题,gorm执行查询时如何选中特定字段?

news2024/9/21 12:23:49

代码获取

本篇文章的代码放在了Github上,可以免费获取。
https://github.com/zhangdapeng520/zdpgo_gin_examples

概述

在查询用户信息的时候,由于密码这个字段比较敏感,需要进行处理,不要返回给前端。

我一开始的解决方案是直接查询数据以后做一次转换,但是这种方案效率比较低,所以我就在思考有没有更快的方案?

比如说,能不能直接选择特定字段进行查询。

结果是令人满意的,gorm提供了Select这个方法,可以让我们选择特点的字段。

官方文档

https://gorm.io/zh_CN/docs/query.html

Select allows you to specify the fields that you want to retrieve from database. Otherwise, GORM will select all fields by default.

db.Select("name", "age").Find(&users)
// SELECT name, age FROM users;

db.Select([]string{"name", "age"}).Find(&users)
// SELECT name, age FROM users;

db.Table("users").Select("COALESCE(age,?)", 42).Rows()
// SELECT COALESCE(age,'42') FROM users;

Also check out Smart Select Fields

刚开始的解决方案

func userGetAll(c *gin.Context) {
	var users []model.User
	g.GDB.Find(&users)

	// 转换
	var data []userResponse
	for _, user := range users {
		data = append(data, userResponse{
			Id:       user.Id,
			Username: user.Username,
			Money:    user.Money,
		})
	}

	c.JSON(200, data)
}

通过postman进行测试。
在这里插入图片描述

经过实测,这种方案确实是能够查询到想要的东西的。

然后我检查了日志:
在这里插入图片描述

消耗的时间是1.0227ms。

该方案缺点

1、代码量比较多,需要定义额外的结构体,需要编写解析的代码。
2、时间复杂多明显增加,因为遍历操作是O(n),所以时间复杂度会增加O(n)

后来的解决方案

func userGetAll(c *gin.Context) {
	var users []model.User
	g.GDB.
		Select([]string{"id", "username", "money"}).
		Find(&users)
	c.JSON(200, &users)
}

通过postman进行测试。
在这里插入图片描述

经过实测,也是能够出来的。

然后我观察了一下控制台的日志。
在这里插入图片描述

消耗的时间是,518.8us,之前的方案是 1.0227ms。

1ms = 1000us,所以通过Python可以计算。

在这里插入图片描述

新方案的时间是之前方案的1.97倍,也就是将近2倍的时间。

这个是在数据量只有1条的情况下,如果数据量变得非常多,新方案的收益是非常可观。

新方案的缺点

主要是在回显给前端的时候,有password的这个字段,虽然这个字段是空的。

解决方案

给结构体的json解析tag增加标签,增加omitempty这个标识符。表示如果该字段是空值,就不要解析了。

type User struct {
	Id       int     `json:"id"`
	Username string  `json:"username"`
	Password string  `json:"password,omitempty"`
	Money    float64 `json:"money"`
}

经过 postman 实测,效果达到了。
在这里插入图片描述

经过多次请求的测试,发现接口性能有一定的提升。
在这里插入图片描述

总结

本篇文章主要讲解了gorm如果实现指定字段查询,然后还提供了go语言json解析时如果字段是空值如何不让其回显给前端的方案。

人生苦短,我用pygo,我是您身边的Python私教。

如果你想学编程,做项目,或者提升自己的技术,都欢迎您联系我。

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

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

相关文章

统计学:条件概率模型

照片由Edge2Edge Media在Unsplash上拍摄 一、介绍 在概率的许多应用中,不可能直接观察实验的结果;而是观察与结果相关的事件。因此,条件概率模型对于考虑和利用从观察到的事件中获得的信息至关重要。此外,条件概率模型与贝叶斯定理…

【vue3】【elementPlus】【黑暗模式】

从创建vue3项目到引入elementPlus组件并设置黑暗模式 1.创建vue3项目: npm init vuelatest1.1 根据需求定制项目插件: 2.引入elementPlus组件: npm install element-plus --save2.1 如图注册全局elementPlus组件: ------------…

充电不再难,高质量充电体系‘智’领绿色出行新时代

充电不再难,高质量充电体系‘智’领绿色出行新时代 国家发展改革委新闻发言人近日在新闻发布会上郑重声明,将持续强化统筹协调,协同各相关部门加速构建高质量充电基础设施体系,以更有效地满足人民群众对绿色出行的需求。 新能源汽…

C语言:文件处理

文件处理 一、文件的类型(一)文本文件和二进制文件 (二)程序文件和数据文件数据文件按照二进制储存 二、文件的打开和关闭(一)文件指针(二)文件的打开和关闭1、fopen2、fclose &…

webshell管理工具-中国蚁剑

中国蚁剑 版本说明:中国蚁剑 下载地址:GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器AntSword 加载器. Contribute to AntSwordProject/AntSword-Loader development by creating an account on GitHub.https://github.com/AntSwordProj…

数值分析【2】

目录 第三章 求解三角方程组​编辑 高斯消元​编辑 乘除次数:系数阵k^2,每行系数计算1,右边那列1 乘除总次数:​编辑 平方和 公式 列主元消去法 ​编辑 目的:舍入误差不扩散​编辑 直接LU分解​编辑 改进平方…

C#开发常见面试题三(浅复制和深复制的区别)

C#开发常见面试题三(浅复制和深复制的区别) 一.浅复制和深复制定义 (1)浅复制:复制一个对象的时候,仅仅复制原始对象中所有的非静态类型成员和所有的引用类型成员的引用。(新对象和原对象将共享所有引用类型成员的实…

django如何更新数据库字段并与数据库保持同步?

关键步骤: 第一步: 执行:python manage.py makemigrations 你的项目名称第二步:它会提示你选1还是2,这里因为添加字段,所以选1第三步:出现>>>这个,直接输入这个第四步&am…

Win11+docker+vscode配置anomalib并训练自己的数据(3)

在前两篇博文中,我使用Win11+docker配置了anomalib,并成功的调用了GPU运行了示例程序。这次我准备使用anomalib训练我自己的数据集。 数据集是我在工作中收集到的火腿肠缺陷数据,与MVTec等数据不同,我的火腿肠数据来源于多台设备和多个品种,因此,它们表面的纹理与颜色差异…

C语言 | Leetcode C语言题解之第329题矩阵中的最长递增路径

题目: 题解: const int dirs[4][2] {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int rows, columns;typedef struct point {int x, y; } point;int longestIncreasingPath(int** matrix, int matrixSize, int* matrixColSize) {if (matrixSize 0 || matrixC…

基于双PI+EKF扩展卡尔曼滤波的PMSM速度控制simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PMSM数学模型 4.2 双PI控制器设计 4.3 扩展卡尔曼滤波器(EKF) 4.4 控制系统实现 5.完整工程文件 1.课题概述 基于双PIEKF扩展卡尔曼滤波的PMSM速度控制simulink建模与仿真。对比基于双PI的扩展卡…

【C/C++笔记】:易错难点3 (二叉树)

选择题 🌈eg1 一棵有15个节点的完全二叉树和一棵同样有15个节点的普通二叉树,叶子节点的个数最多会差多少个()? 正确答案: C A. 3 B. 5 C. 7 D. 9 解析:普通二叉树的叶子节…

Java刷题:轮转数组

目录 题目 解题思路 完整代码 题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解题思路 主要的解题思路是,先把整个数组翻转过来&a…

如何解决.NET8 类库Debug时,Debug文件夹中不包含Packages中引入的文件

最近在开发中使用了.NET8 Razor类库项目&#xff0c;但是惊讶的发现Debug时&#xff0c;Debug文件夹中不包含Packages中引入的文件&#xff0c;本以为是非常小的问题&#xff0c;但是被困住了竟然足足4个小时。 其实它也本就是个非常非常小的问题…… 只需引入<CopyLocalL…

智驭灌区,科技领航—— 高效灌区信息化系统管理平台

在水资源日益珍贵的今天&#xff0c;传统灌区的粗放式管理模式已难以满足现代农业的发展需求。我们自豪地推出——灌区信息化系统管理平台&#xff0c;以科技赋能水利&#xff0c;引领灌溉管理进入智能化、精细化新时代。 【智能决策&#xff0c;精准灌溉】 告别传统灌溉的盲目…

84.WEB渗透测试-信息收集-框架组件识别利用(8)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;83.WEB渗透测试-信息收集-框架组件识别利用&#xff08;7&#xff09; 识别的作用&#…

【初阶数据结构题目】15.有效的括号

有效的括号 点击链接答题 思路&#xff1a; 定义一个指针ps遍历字符串 若ps遍历到的字符为左括号&#xff0c;入栈 若ps遍历到的字符为右括号&#xff0c;取栈顶元素与ps进行比较&#xff0c; 栈顶元素 匹配 *ps&#xff0c;出栈&#xff0c;ps栈顶元素 不匹配 *ps&#xff0c…

【Python】nn.CTCLoss()函数详解与示例

前言 在深度学习领域&#xff0c;特别是在处理序列到序列的预测任务时&#xff0c;如语音识别和手写识别&#xff0c;nn.CTCLoss函数是一个非常重要的工具。本文将详细解析PyTorch中的nn.CTCLoss函数&#xff0c;包括其原理、原型和示例。 前言函数原理CTC算法简介CTC Loss函数…

Golang在整洁架构基础上实现事务

前言 大家好&#xff0c;这里是白泽&#xff0c;这篇文章在 go-kratos 官方的 layout 项目的整洁架构基础上&#xff0c;实现优雅的数据库事务操作。 视频讲解 &#x1f4fa;&#xff1a;B站&#xff1a;白泽talk 本期涉及的学习资料&#xff1a; 我的开源Golang学习仓库&am…

【随笔】详解Java POI及其使用方法

引言 随着企业和开发者对数据处理需求的不断增加&#xff0c;操作Excel文件已经成为日常编程工作的重要部分。在Java中&#xff0c;Apache POI&#xff08;Poor Obfuscation Implementation&#xff09;库虽然首页其貌不扬&#xff0c;但它绝对是处理Excel文件的强大工具。本文…