当前位置: 首页 > 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私教。

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

http://www.lryc.cn/news/417168.html

相关文章:

  • 计算机网络11——数据库语法2
  • 华为USG6000E-S12防火墙Key exchange failed.无法SSH解决方案
  • matlab基础操作(五)
  • 力扣 两数之和
  • Django 实现连续请求
  • 前端(react)框架nextjs
  • 深耕编程语言18年,对话 Rust、TypeScript、Nushell 核心贡献者 Sophia Turner | Open AGI Forum
  • 深度学习--图像分割UNet介绍及代码分析
  • 接了一个2000块的小活,大家进来看看值不值,附源码
  • 基于MindFormers实现GPT2模型的推理
  • 探索腾讯云AI代码助手:智能编程的新时代
  • MySQL 之 MHA 高可用架构详解
  • WangEditor自定义新元素,并解决自定义元素中换行无法消除样式的问题
  • VBA Excel口算题
  • C++理解临时对象的来源
  • C++协助完成返回值优化
  • 2024年睿抗机器人开发者大赛(RAICOM)国赛题解
  • 声明式UI语法
  • JDBC连接数和1521连接数之间的区别和联系(Java Database Connectivity)
  • Leetcode - 136双周赛
  • SQLite ORDER BY 语句
  • MTK Android12 系统中应用加载 .so 文件的问题分析
  • bpmn简单使用(制作流程图)
  • 【算法模板】算竞技巧:Python对拍数据生成
  • 计算机基本理论与程序运行原理概述
  • SpringBoot中的server.context-path
  • AI绘画绘画 Stable Diffusion ,从零开始轻松变现,AI绘画副业创收指南,一天一个AI帮你赚钱小技巧!
  • 阿里云镜像站,提供了各种第三方镜像地址
  • stm32入门学习11-硬件I2C和MPU
  • 如何在C++、PHP、GO中使用AI生成PPT API接口