• 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.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私教。

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

  • 相关阅读:
    Mybatis-plus 学习分享
    shopee马来西亚和菲律宾站哪个好做?做shopee跨境如何选择站点?
    【图像去噪】基于边缘增强扩散 (cEED) 和 Coherence Enhancing Diffusion (cCED) 滤波器实现图像去噪附matlab代码
    Java 内存溢出(二)使用 MAT 分析 .hprof 内存映像文件
    Centos - DBMS(MariaDB)服务搭建
    【数据分享】城市建成区边界矢量数据(7个年份/全国范围)
    霍格沃兹全国测试开发火焰杯专业人才大赛
    Java秒杀系统设计
    面试题:“中国浙江杭州”这样的一串字符串有多少个不重复的排序组合?
    软件项目质量管理体系,软件评审,资质认证,安全建设及项目管理匹配资料(原件参考)
  • 原文地址:https://blog.csdn.net/qq_37703224/article/details/140971580