选择与 GORM 一起存在

Zei*_*zar 8 exists go go-gorm

我想检查数据库表中是否存在一行。我首先使用了这种方法:

type MyStruct struct {
    ID    uint32
    Key   string
    Value string
}

var result MyStruct

err := db.
    Where("id = ? AND `key` = ? AND `value` = 0", myID, myKey).
    First(&result).
    Error

if err != nil {
    if err == gorm.ErrRecordNotFound {
        logrus.Error("ErrRecordNotFound")
    }
    logrus.Errorf("Other DB error: %s", err.Error())
}
Run Code Online (Sandbox Code Playgroud)

但我想通过编写原始 SQL 来实现这一点。我尝试了以下操作:

var result bool

db.Raw("SELECT EXISTS(SELECT 1 FROM my_table WHERE id = ? AND `key` = ? AND `value` = ?)",
    myID, myKey, "0").Scan(&result)
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

unsupported destination, should be slice or struct.
Run Code Online (Sandbox Code Playgroud)

我也尝试使用方法Exec并得到相同的错误。

请注意,该变量db是一个*gorm.DB实例。

Vla*_*tem 15

您可以尝试以下方法

var exists bool
err = db.Model(model).
         Select("count(*) > 0").
         Where("id = ?", id).
         Find(&exists).
         Error
Run Code Online (Sandbox Code Playgroud)


小智 6

如果你想避免 ErrRecordNotFound 错误,你可以使用像 db.Limit(1).Find(&user) 这样的 Find,Find 方法同时接受结构体和切片数据

r := db.
    Where("id = ? AND `key` = ? AND `value` = 0", myID, myKey).
    Limit(1).
    Find(&result)

r.Error
// handle error

exists := r.RowsAffected > 0
Run Code Online (Sandbox Code Playgroud)