【问题标题】:RecordNotFound returns false when there are no rows没有行时 RecordNotFound 返回 false
【发布时间】:2018-08-28 21:01:53
【问题描述】:

我遇到了this library 的问题,因为即使给定的输入不在数据库中,这个函数也会返回 false,而实际上它应该返回 true。

type User struct {
    ID          uint      `gorm:"primary_key"`
    Username    string    `json:",omitempty"`
    Password    string    `json:",omitempty"`
    CreatedAt   time.Time `json:",omitempty"`
}

b, err := db.Con()
if err != nil {
    log.Panic(err)
}

defer db.Close()

// We want an empty struct
// Otherwise it will trigger the unique key constraint
user := []User{}

// Check if the username is taken
// BUX, MUST FIX: This always returns false for some reason
if db.Where(&User{Username: "MyUsername"}).Find(&user).RecordNotFound() == false {
    fmt.Println("Username found")
}

为什么总是返回false,即使字符串为空?

【问题讨论】:

  • 来自错误的文档:"ErrRecordNotFound 记录未找到错误,仅在使用结构查找时未找到任何匹配数据时发生,找不到切片' t 返回此错误"(强调我的)link
  • 嘿@Jeffrey,您是否希望在您的数据库中有多个用户名相同的用户(一个坏主意)?

标签: go go-gorm


【解决方案1】:

看起来 .RecordNotFound() 出于某种原因已从 SDK 中删除。

现在使用它来处理未找到记录的错误

dbRresult := userHandler.db.Where("email = ?", email).First(&user)
if errors.Is(dbRresult.Error, gorm.ErrRecordNotFound) {
    // handle record not found
}

【讨论】:

  • 找不到记录时会向控制台打印错误。我怎样才能避免这种情况?
【解决方案2】:

以下代码应该可以按您的预期工作:

// We want an empty struct
user := User{} // We expect to have one (or no) user returned.

// Check if the username is taken
// Notice the use of First() instead of Find()
if !db.Where("username = ?", "MyUsername").First(&user).RecordNotFound() {
    fmt.Println("Username found, here's the user:", user)
} else {
    fmt.Println("Username not found")
}

正如mkopriva 已经提到的,ErrRecordNotFound 在您使用切片时不会触发。

由于您不需要切片(您的用户名应该是唯一的)我们可以:

  1. 引用不是部分用户而是单个用户 User{} 而不是 []User{}

  2. 使用gorms First() 方法代替Find()

【讨论】:

  • @Jeffrey Anderson,因为你是新手。如果您认为这个答案可以接受,并且它已经解决了您的问题。确保您accept this answer,这样其他用户可以更轻松地找到解决方案。
  • 谢谢,我不知道。如果字符串为空,它仍然会返回用户,但我设法自己解决了这个问题!
  • 这里只有一个问题,它不区分大小写。如果用户“MyUser”存在但输入是“myUser”,那么它将返回true。我也在做同样的检查电子邮件,电子邮件必须区分大小写,所以我不能ToLower()他们。如何解决这个问题?
  • .RecordNotFound() 已从 Gorm 中删除。
  • 当找不到记录时,First() 也会向控制台打印一个错误。
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 2015-02-24
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多