Go语言 没有行时,RecordNotFound返回false

wlp8pajw  于 2023-06-03  发布在  Go
关注(0)|答案(3)|浏览(296)

我在使用这个库时遇到了一个问题,因为即使给定的输入不在数据库中,这个函数也会返回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,即使字符串是空的?

py49o6xq

py49o6xq1#

看起来.RecordNotFound()由于某种原因从SDK中删除了。
现在使用这个来处理record not found错误

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

col17t5w2#

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

// 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{}
1.使用gormsFirst()方法代替Find()

zzlelutf

zzlelutf3#

两者类型不同,因此可以添加.Error()以确保它们是字符串

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

相关问题