当前位置: 首页 > news >正文

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

代码获取

本篇文章的代码放在了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.Userg.GDB.Find(&users)// 转换var data []userResponsefor _, 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.Userg.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私教。

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

相关文章:

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

代码获取 本篇文章的代码放在了Github上,可以免费获取。 https://github.com/zhangdapeng520/zdpgo_gin_examples 概述 在查询用户信息的时候,由于密码这个字段比较敏感,需要进行处理,不要返回给前端。 我一开始的解决方案是直…...

计算机网络11——数据库语法2

1、变量 (1)局部变量 函数里面定义的,变量名 类型 (2)会话变量 本次连接会话有效,不需要定义声明,直接使用,@变量名 类型 set @x=10; select @x;(3)系统变量 又叫全局变量,只有root变量才能使用,一直有效。因为全局变量影响服务器运行,所以Mysql不允许自定…...

华为USG6000E-S12防火墙Key exchange failed.无法SSH解决方案

由于目前防火墙算法太新,导致crt和xshell的版本无法登陆,按以下方法解决 一、下载华为本地加载除弱安全算法组件包之外的组件包 二、先改后缀名为.cfg,上传文件到防火墙 三、在用户视图下改后缀名为.mod 四、move 文件到$_install_mod文件夹 五、执行…...

matlab基础操作(五)

31.数组维数的减小 >> amagic(4),a(:,2)[] >> a(1,2)[] 带有下标的赋值维度不匹配。 >> a(2:4)[]%数组a将变为向量 32.元胞数组的创建 Cell indexing方式创建元胞数组 >> c(1,1){[1 4 3;0 5 8;7 2 9]} >> c(1,2){Anne Smith} >> c(2,1){…...

力扣 两数之和

致每一个初学算法的你。 题目 时间复杂度&#xff1a;O(N^2)&#xff0c; 空间复杂度&#xff1a;O(1) 。 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {if (nums[i] …...

Django 实现连续请求

创作灵感&#xff1a;工作中&#xff0c;前端因为某些原因&#xff08;极其特殊&#xff09;无法发送两个请求&#xff0c;需要后端实现 言归正传&#xff1a; 背景&#xff1a;使用djangoapscheduler实现定时任务&#xff0c;现在创建任务以及启动任务为两个接口&#xff0c…...

前端(react)框架nextjs

文章目录 一、什么是next.js1. 路由2. 打包 next build3. 部署 二、 next.js 和react区别三、webstorm使用nextjs四、开发常用总结如何修nextjs 启动监听的端口号&#xff1f;NGINX 反向代理 Next.js 项目配置 参考 一、什么是next.js 官网&#xff1a; https://www.nextjs.cn…...

深耕编程语言18年,对话 Rust、TypeScript、Nushell 核心贡献者 Sophia Turner | Open AGI Forum

作者 | Annie Xu 采访 | 卢威 责编 | Echo Tang 出品丨GOSIM 开源创新汇 编程语言的种类令人眼花缭乱&#xff0c;但成功的、常用的编程语言却是凤毛麟角。在深耕编程语言研发 18 年的 Sophia June Turner 看来&#xff0c;编程语言成功的关键在于其研发团队的透明度和机制建…...

深度学习--图像分割UNet介绍及代码分析

UNet介绍 参考UNet网络介绍整体架构UNet过程输入编码器&#xff08;下采样&#xff09;中间特征表示解码器&#xff08;上采样&#xff09;输出 代码详解unetUP和Unet关系上采样模块——unetUp用于图像分割的卷积神经网络&#xff08;CNN&#xff09;架构模块——Unet类的定义初…...

接了一个2000块的小活,大家进来看看值不值,附源码

如题&#xff0c;上周的一天&#xff0c;朋友圈的一个旧友找到了我&#xff0c;说让我帮他开发一个小工具&#xff0c;虽然活不大&#xff0c;但没个几年的全栈经验还不一定能接下来&#xff0c;因为麻雀虽小&#xff0c;涉及的内容可不少&#xff1a; 需求分析 原型设计 详细…...

基于MindFormers实现GPT2模型的推理

前言 针对MindFormers的安装&#xff0c;可参考本专栏里的另一篇博客 安装MindFormers&#xff08;昇腾910&#xff09;-CSDN博客 pipeline方式 from mindformers import pipeline from mindformers import GPT2LMHeadModel, GPT2Config, GPT2Tokenizer tok GPT2Tokenizer…...

探索腾讯云AI代码助手:智能编程的新时代

智能编程的新时代 前言开发环境介绍腾讯云 AI 代码助手使用实例生成文档解释代码生成测试修复代码人工智能技术对话 智能编程获得的帮助与提升对腾讯云AI代码助手的建议结语 前言 hello&#xff0c;大家好我是恒川&#xff0c;今天我来给大家安利一款非常好用的AI 代码助手&…...

MySQL 之 MHA 高可用架构详解

这个是在内部分享做的一个 Keynote 动画&#xff0c;用来演示 MHA 高可用架构及发生故障时的 Failover。动画如下&#xff1a; 数据库相关分享之 MySQL 的 MHA 架构详解 引言 MySQL 数据库在企业和应用中扮演着举足轻重的角色&#xff0c;其稳定性和可靠性对于业务的连续运行至…...

WangEditor自定义新元素,并解决自定义元素中换行无法消除样式的问题

一、背景概述 项目有自定义样式模板的需求&#xff0c;WangEditor没有。若直接把样式的html插入WangEditor中&#xff0c;无法解析&#xff0c;且会被自动过滤。因此&#xff0c;需要基于WangEditor提供的API进行二次开发。 例如&#xff0c;需要新增以下样式&#xff1a; 该…...

VBA Excel口算题

口算题函数 利用随机数写个20以内加减法口算题函数 Function Kousuan()Dim intOne As IntegerDim intTwo As IntegerDim strFlg As StringDim intFlg As IntegerDim strRtn As StringintFlg Application.WorksheetFunction.RandBetween(0, 1)strFlg "-"If intFlg…...

C++理解临时对象的来源

当程序员之间进行交谈时&#xff0c;他们经常把仅仅需要一小段时间的变量称为临时变量。例如在下面这段swap(交换)例程里&#xff1a; template<class T> void swap(T& object1, T& object2) { T temp object1; object1 object2; object2 temp; } 通常把t…...

C++协助完成返回值优化

一个返回对象的函数很难有较高的效率&#xff0c;因为传值返回会导致调用对象内的构造和析构函数(参见条款M19)&#xff0c;这种调用是不能避免的。问题很简单&#xff1a;一个函数要么为了保证正确的行为而返回对象要么就不这么做。如果它返回了对象&#xff0c;就没有办法摆脱…...

2024年睿抗机器人开发者大赛(RAICOM)国赛题解

目录 RC-u1 大家一起查作弊 分数 15 RC-u2 谁进线下了&#xff1f;II 分数 20 RC-u3 势均力敌 分数 25 RC-u4 City 不 City 分数 30 RC-u5 贪心消消乐 分数 30 RC-u1 大家一起查作弊 分数 15 简单模拟题&#xff0c;对于多行读入使用while(getline(cin…...

声明式UI语法

一、ArkTS的基本组成 Entry // 装饰器 Component // 装饰器 struct Hello { // 自定义组件State myText: string World;build() { // UI描述Column() { // 系统组件Text(Hello ${this.myText}).fontSize(50)Divider()Button(Click me).onClick(() > { // 事件方法t…...

JDBC连接数和1521连接数之间的区别和联系(Java Database Connectivity)

JDBC&#xff08;Java Database Connectivity&#xff09;连接数和1521连接数之间的区别和联系如下&#xff1a; 区别 概念不同&#xff1a; JDBC连接数&#xff1a;指通过JDBC技术建立的数据库连接数。JDBC是Java中的一套API&#xff0c;用于连接和操作关系数据库。JDBC连接数…...

PHP 8.9扩展模块安全配置失效了吗?3类高危漏洞正在 silently hijack 你的生产环境

第一章&#xff1a;PHP 8.9扩展模块安全加固配置概览PHP 8.9&#xff08;当前为前瞻预发布版本&#xff0c;基于PHP 8.3持续演进的实验性分支&#xff09;在扩展模块层面引入了更严格的加载策略与运行时权限控制机制。安全加固的核心目标是&#xff1a;最小化默认启用扩展、强制…...

SQLServer跨平台迁移实战:从Windows备份到Linux还原的完整指南

1. 迁移前的准备工作 跨平台迁移数据库就像搬家前的打包工作&#xff0c;需要提前确认好物品清单和运输工具。我经历过多次SQL Server从Windows到Linux的迁移&#xff0c;发现90%的问题都出在准备阶段。以下是必须检查的关键点&#xff1a; Windows端必备条件&#xff1a; 确保…...

OmAgent性能优化技巧:10个方法提升你的AI代理运行效率

OmAgent性能优化技巧&#xff1a;10个方法提升你的AI代理运行效率 【免费下载链接】OmAgent [EMNLP-2024] Build multimodal language agents for fast prototype and production 项目地址: https://gitcode.com/gh_mirrors/om/OmAgent OmAgent是一个用于构建多模态语言…...

Windows与Office激活终极指南:告别弹窗烦恼的完整解决方案

Windows与Office激活终极指南&#xff1a;告别弹窗烦恼的完整解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经遇到过Windows系统突然弹出激活提示&#xff0c;或者Office软件…...

说话人识别中的性别差异:为什么你的模型对女声准确率更低?

说话人识别中的性别差异&#xff1a;为什么你的模型对女声准确率更低&#xff1f; 在语音技术领域&#xff0c;说话人识别系统已经取得了显著进展&#xff0c;但一个长期存在的问题是&#xff1a;为什么这些系统对女性声音的识别准确率往往低于男性&#xff1f;这种现象不仅存在…...

终极指南:如何使用FakeLocation实现应用级虚拟定位保护隐私

终极指南&#xff1a;如何使用FakeLocation实现应用级虚拟定位保护隐私 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 你是否厌倦了应用随意获取你的真实位置&#xff1f;想不想…...

从零打造桌面级MicroUSB转TTL调试器:基于CH340N的极简实践

1. 为什么你需要一个桌面级MicroUSB转TTL调试器 作为一个经常和单片机打交道的开发者&#xff0c;我太理解那种弯腰插拔USB线的痛苦了。特别是当你的工作台堆满各种开发板和元器件时&#xff0c;每次调试都要在桌底摸索USB接口&#xff0c;不仅效率低下&#xff0c;还容易把其他…...

Linux I/O 演进史:从管道到零拷贝,一篇串起个服务端核心原语克

前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时&#xff0c;输出结果中包含大量由集群自动生成的元数据&#xff08;如 managedFields、resourceVersion、uid 等&#xff09;。这些信息在实际复用 yaml 清单时需要手动清理&#xff0c;增加了额外的工作量。 使用 kube…...

ElementPlus主题定制实战:从零到一打造个性化UI风格

1. 为什么需要定制ElementPlus主题&#xff1f; 在实际项目开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;UI设计师给出一套全新的配色方案&#xff0c;要求将ElementPlus默认的蓝色主题替换成项目专属的配色。这时候很多新手开发者可能会直接通过CSS样式覆盖的方式修…...

CODESYS开发实战:指针与动态内存分配的高级应用

1. 指针基础&#xff1a;从内存模型到实战应用 指针这个概念对于刚接触CODESYS开发的工程师来说&#xff0c;往往既神秘又令人畏惧。我第一次在项目中遇到指针问题时&#xff0c;整整花了三天时间才搞明白为什么程序会莫名其妙崩溃。指针本质上就是内存地址的变量化表示&#x…...