Select 存在于 GORM 中

Select exists with GORM

我想检查数据库中是否存在一行 table。我第一次使用这种方法:

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())
}

但是我想通过写一个原始的 SQL 来实现这个。我试过以下:

var result bool

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

但是我得到这个错误:

unsupported destination, should be slice or struct.

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

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

您的 result 应该是结构或切片,而不是布尔值。更多信息在这里:https://gorm.io/docs/sql_builder.html#Raw-SQL

这应该有效:

var result struct {
  Found bool
}

db.Raw("SELECT EXISTS(SELECT 1 FROM my_table WHERE id = ? AND `key` = ? AND `value` = ?) AS found",
    myID, myKey, "0").Scan(&result)

另一种检查是否存在的方法是使用 Count:

count := int64(0)
err := db.Model(&MyStruct{}).
    Where("id = ? AND key = ? AND value = 0", myID, myKey).
    Count(&count).
    Error
// handle error
exists := count > 0

可能回复晚了,但我想分享我找到的答案,可以直接扫描成布尔值。应将变量名称更改为大写字母以实现此目的。

例如:

var Found bool

db.Raw("SELECT EXISTS(SELECT 1 FROM magic_table WHERE magic_field1 = ? AND magic_field2 = ? AND magic_field3 = ?) AS found",
    valOfMagicField1, valOfMagicField2, valOfMagicField3).Scan(&Found)   

如果你想避免 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

您可以尝试以下方法

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