gorm库的Find方法引发的问题

一、问题引入?

笔者在学习一个项目时,有一个登录需求,在登录时需要判断用户是否存在,特引入了Find方法做查询,然后根据返回值做判断,没想到因为Find的特性,导致判断存在问题,不管用户名是否存在,都会返回一个user实例,导致登录逻辑出错

二、分析

1、初始代码如下:

//判断用户名是否存在
func (dao *UserDao) ExistOrNotByUserName(userName string) (user *model.User, exist bool, err error) {err = dao.DB.Model(&model.User{}).Where("user_name=?", userName).Find(&user).Errorif user == nil || err == gorm.ErrRecordNotFound { //判断逻辑,问题所在点return nil, true, err}return user, false, nil
}//登录判断
func (service *UserService) Login(ctx context.Context) serializer.Response {var user *model.Usercode := e.SuccessuserDao := dao.NewUserDao(ctx)user, exist, err := userDao.ExistOrNotByUserName(service.UserName)fmt.Println("user:", user, ":exist", exist, ":err:", err)if exist || err != nil {code = e.ErrorExistUserNotFoundreturn serializer.Response{Status: code,Msg:    e.GetMsg(code),Data:   "用户不存在,请先注册",}}

在上述代码中,ExistOrNotByUserName 方法的判断条件中有user == nil 这个选项,正是因为这样,导致不管我输入的用户名是什么,都会进入if语句为true的条件下,使得并没有得到我想要的效果。

2、原因分析

后来经过调试,发现经过Find函数查询后,返回的user是有值的

        当用户名不存在时,Find 操作会返回一个空的 user 对象而不是 nil。这是因为 gorm 库在查询数据库时,即使没有找到匹配的记录,也不会返回 nil,而是返回一个实例化的对象。

        这是因为 gorm 库的默认行为,尤其是当使用 Find 函数时。当 gorm 执行查询但没有找到记录时,它会返回一个实例化的对象,并将该对象的主键字段设为零值。 model.User 结构体中,主键字段是 ID

3、解决方法

 (1)还是使用Find函数,但是增加判断条件
 

// ExistOrNotByUserName 根据UserName判断是否存在该名字
func (dao *UserDao) ExistOrNotByUserName(userName string) (user *model.User, exist bool, err error) {err = dao.DB.Model(&model.User{}).Where("user_name=?", userName).Find(&user).Errorif err == gorm.ErrRecordNotFound || (user != nil && user.ID == 0) {return nil, false, err //用户不存在} else if err != nil {return nil, true, err //查询时出现错误}return user, false, nil //用户存在
}func (service *UserService) Login(ctx context.Context) serializer.Response {var user *model.Usercode := e.SuccessuserDao := dao.NewUserDao(ctx)user, exist, err := userDao.ExistOrNotByUserName(service.UserName)fmt.Println("user:", user, ":exist", exist, ":err:", err)if user == nil || err != nil {code = e.ErrorExistUserNotFoundreturn serializer.Response{Status: code,Msg:    e.GetMsg(code),Data:   "用户不存在,请先注册",}}

(2)使用First函数

func (dao *UserDao) UserExists(userName string) (bool, error) {var user model.Usererr := dao.DB.Where("user_name=?", userName).First(&user).Errorif err == gorm.ErrRecordNotFound {return false, nil // 用户不存在} else if err != nil {return false, err // 查询时出现错误}return true, nil // 用户存在
}

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

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

相关文章

C# App.xaml.cs的一些操作

一、保证只有一个进程 1.1 关闭旧的,打开新的 protected override void OnStartup(StartupEventArgs e) {base.OnStartup(e);var process Process.GetProcessesByName("Dog");if (process.Count() > 1) {var list process.ToList();list.Sort((p1,p2…

DirectX12_Windows_GameDevelop_3:Direct3D的初始化

引言 查看龙书时发现,第四章介绍预备知识的代码不太利于学习。因为它不像是LearnOpenGL那样从头开始一步一步教你敲代码,导致你没有一种整体感。如果你把它当作某一块的代码进行学习,你跟着敲会发现,总有几个变量是没有定义的。这…

乌班图22.04 kubeadm简单搭建k8s集群

1. 我遇到的问题 任何部署类问题实际上对于萌新来说都不算简单,因为没有经验,这里我简单将部署的步骤和想法给大家讲述一下 2. 简单安装步骤 准备 3台标准安装的乌班图server22.04(采用vm虚拟机安装,ip为192.168.50.3&#xff0…

STC89C51基础及项目第10天:LCD显示字符(非标协议外设)

1. 初识LCD1602(233.79) 非标协议外设 LCD1602显示 LCD1602(Liquid Crystal Display)是一种工业字符型液晶,能够同时显示 1602 即 32 字符(16列两行) 引脚说明 第 1 脚: VSS 为电源地第 2 脚&#xff1…

Spark SQL 外部数据源

1.简介 1.1 多数据源支持 Spark 支持以下六个核心数据源,同时 Spark 社区还提供了多达上百种数据源的读取方式,能够满足绝大部分使用场景。 - CSV - JSON - Parquet - ORC - JDBC/ODBC connections - Plain-text files 1.2 读数据格式 所有读取 API 遵循以下调用格式: // …

SpringBoot项目默认使用HikariDataSource数据库连接池修改使用Druid连接池

1.启动项目&#xff0c;查看正在使用的链接池。 2.在pom.xml文件中引入驱动 <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency> 3.在ap…

【不定期更新】什么是Linux内核

2023年10月7日&#xff0c;周日晚上 目录 硬件资源管理 进程调度 文件系统管理 设备驱动 网络功能 Linux内核中的主要网络功能 安全 系统调用接口 Linux内核提供了哪些系统调用接口&#xff1f; 总结 Linux内核是Linux操作系统的核心&#xff0c;它起到以下主要的作用…

机器视觉工程师,公司设置奖金,真的为了奖励你吗?其实和你没关系

​据说某家大厂&#xff0c;超额罚款&#xff0c;有奖有罚很正常&#xff0c;但是我觉得你罚款代理商员工就不一样了&#xff0c;把代理商当成你的员工&#xff0c;我就觉得这些大厂的脑回路有问题。 有人从来没听说过项目奖金&#xff0c;更没有奖金。那么为什么设置奖金呢&a…

数字化转型频频失败?一体化模式提供新的思考

数字化连续6年出现在政府报告中&#xff0c;从《中小企业数字化赋能专项行动方案》到《关于推进“上云用数赋智”行动》、《“十四五” 规划和 2035 年远景目标建议》、《中小企业数字化转型指南》&#xff0c;再到2023年2月《数字中国建设整体布局规划》&#xff0c;加快数字化…

Java spring boot常用注解

Spring Boot是一个基于Spring框架的开发框架&#xff0c;它简化了Spring应用的配置和部署过程&#xff0c;提供了一系列注解来帮助开发人员快速构建可靠和高效的应用程序。本文将详细介绍Spring Boot中常用的注解及其使用方法。 Spring Boot注解可以分为以下几个方面&#xff…

MM-Camera架构-ProcessCaptureRequest 流程分析

文章目录 processCaptureRequest\_3\_41.1 mDevice1.2 mDevice->ops->process\_capture\_request1.3 hardware to vendor mct\_shimlayer\_process\_event2.1 mct\_shimlayer\_handle\_parm2.2 mct\_shimlayer\_reg\_buffer processCaptureRequest_3_4 sdm660的摄像头走…

图论第2天----第1020题、第130题

# 图论第2天----第1020题、第130题 文章目录 一、第1020题--飞地的数量二、第130题--被围绕的区域 ​ 又继续开始修行&#xff0c;把图论这块补上&#xff0c;估计要个5-6天时间。 一、第1020题–飞地的数量 ​ 跟前面做的思路差不多&#xff0c;其实有另外一种思路。我这里是…

mysql5.7停止维护时间

mysql5.7将于2023年10月停止官网支持和更新&#xff1b;老项目要准备升级&#xff0c;新项目的mysql必须是mysql8.0&#xff08;2023-10&#xff09; 官方升级咨询地址 oracle官方升级咨询地址https://go.oracle.com/LP116153?elq_mid247718&sh1518132002061316121320310…

数据结构—栈、队列、链表

一、栈 Stack&#xff08;存取O(1)&#xff09; 先进后出&#xff0c;进去123&#xff0c;出来321。 基于数组&#xff1a;最后一位为栈尾&#xff0c;用于取操作。 基于链表&#xff1a;第一位为栈尾&#xff0c;用于取操作。 1.1、数组栈 /*** 基于数组实现的顺序栈&#…

波浪input输入框文字边框动画

一个input输入框的小动画,大家可以按需引入和修改 input的动画表现为,文字提示波浪动画 效果图如下 源码如下 tips: 有不懂的可以在评论区问博主 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name&q…

javascript中依次输出元素并不断循环实现echarts柱图动画效果

循环来遍历数组并输出其中的元素 在JavaScript中&#xff0c;你可以使用循环来遍历数组并输出其中的元素。如果你想要依次输出6个元素并不断循环&#xff0c;可以使用如下的代码&#xff1a; let arr [/* 你的数组 */];for (let i 0; i < arr.length; i) {console.log(a…

机器学习笔记(一)

1.线性回归模型 2. 损失函数 3.梯度下降算法 多元特征的线性回归 当有多个影响因素的时候,公式可以改写为: 当有多个影响因素的时候为了方便计算,可以使用 Numpy下面的点积方法, np.dot(w,x) 最后再加个b 就省略了很多书写步骤,这叫做矢量化 多元回归的梯度下降 左边是一…

[Android] Input事件分发流程之IMS初始化(1)

IMS初始化 一、简介 当用户触摸屏幕或者按键操作&#xff0c;首次触发的是硬件驱动&#xff0c;驱动收到事件后&#xff0c;将该相应事件写入到输入设备节点&#xff0c; 这便产生了最原生态的内核事件。接着&#xff0c;输入系统取出原生态的事件&#xff0c;经过层层封装后…

acwing算法基础之基础算法--高精度除法算法

目录 1 知识点2 模板 1 知识点 大数除以小数&#xff0c;返回商和余数。 2 模板 //A是大数&#xff0c;低位在前 //b是小数 //C是商&#xff0c;低位在前 //r是余数 vector<int> div(vector<int> &A, int b, int &r) {vector<int> C;for (int i …

CSS文本超出显示小数点

目录 1、单行文本溢出 2、多行文本溢出 1、基于高度截断 2、基于行数截断 1、单行文本溢出 如果解决文本溢出显示省略号&#xff0c;需要满足的三个条件&#xff1a; 先强制一行内显示文本 white-space:nowrap;/*默认normal 自动换行*/ 超出的文本隐藏起来。 overflow:…