为了账号安全,请及时绑定邮箱和手机立即绑定

使用 golang、gin 和 gorm 与 postgres (如电子邮件)

使用 golang、gin 和 gorm 与 postgres (如电子邮件)

Go
慕森王 2022-10-24 15:20:47
我有这样的事情,我想检查数据库中是否已经存在电子邮件:func RegisterUser(c *gin) {var user models.Userif err := c.ShouldBindJSON(&user); err != nil {    c.JSON(http.StatusBadRequest, gin.H{        "messAge": err.Error(),        "data":    "",    })    return}// **I TRIED SOEMTHING LIKE THIS**err := database.DB.Find(&user.Email).Errorif err != nil {    c.JSON(401, gin.H{"MESSAGE": "Email ALREADY exist",    return}// **but is not working, because ANY mail it give me error**if !strings.Contains(user.Email, "@") {    c.JSON(400, gin.H{"MESSAGE": utils.ErrEmailWrong})    return}if len(user.Password) < 4 {    c.JSON(400, gin.H{"MESSAGE": utils.ErrPasswordLength})    return}database.DB.Create(&user)c.JSON(200, gin.H{    "MESSAGE": "CREATED",})}使用此代码,每次都告诉我:电子邮件已存在,仅第一次有效。
查看完整描述

4 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

请阅读文档: https ://gorm.io/docs/query.html

var userFind models.User
database.DB.Where("email = ?", user.Email).First(&userFind)



查看完整回答
反对 回复 2022-10-24
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

因为,您的 struct 对象不是切片。你应该使用ErrRecordNotFound.


注意:ErrRecordNotFound仅适用于First, Last,Take预计会返回一些结果。并RecordNotFound在 V2 中删除。


if err != nil {

     if errors.Is(err, gorm.ErrRecordNotFound){

           c.JSON(401, gin.H{"MESSAGE": "Email Not Found",

           return


     }

    c.JSON(401, gin.H{"MESSAGE": "Your Message",

    return

}

或者


如果你想避免这个错误ErrRecordNotFound,你可以使用Findlike方法接受结构和切片数据。并像这样检查:db.Limit(1).Find(&user),Find


result.RowsAffected // returns count of records found

为了更好地理解,请参阅此处的链接:https ://gorm.io/docs/v2_release_note.html#ErrRecordNotFound和https://gorm.io/docs/query.html


而且,如果您想通过电子邮件在数据库中添加记录,那么您应该删除唯一约束并在创建记录时检查错误。如果成功创建记录,则返回成功响应,否则返回相应的错误消息。


查看完整回答
反对 回复 2022-10-24
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

它终于工作了!谢谢大家回答!

//img1.sycdn.imooc.com//63563d0b0001a2ea05280104.jpg


查看完整回答
反对 回复 2022-10-24
?
慕容708150

TA贡献1831条经验 获得超4个赞

  1. 您应该在绑定之后和数据库查询之前验证输入

  2. 将您的电子邮件列更改为唯一

  3. 尝试将经过验证的数据插入到 db

    • 如果成功 => 200(没有类似的电子邮件)

    • if err => 检查错误码

例如:

func IsUniqueContraintViolation(err error) bool {

        if pgError, ok := err.(*pgconn.PgError); ok && errors.Is(err, pgError) {

            if pgError.Code == "23505" {

                return true

            }

        }

    

        return false

    }

有关更多信息,您应该查看GoDoc pg lib可能的错误代码
,然后您可以返回合适的错误代码

顺便提一句。希望您不要将清晰的密码保存到数据库:D


查看完整回答
反对 回复 2022-10-24
  • 4 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信