选择与GORM一起存在

kyvafyod  于 2022-12-16  发布在  Go
关注(0)|答案(7)|浏览(165)

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

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示例。

qxsslcnc

qxsslcnc1#

您可以尝试以下方法

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

rqdpfwrv2#

如果要避免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
gv8xihay

gv8xihay3#

您的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)
o2g1uqev

o2g1uqev4#

检查是否存在的另一种方法是使用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
iszxjhcz

iszxjhcz5#

也许是一个迟来的回复,但我想分享我找到的答案,它可以直接扫描到一个布尔值。变量的名称应该改为大写字母来实现这一点。
例如:

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)
dldeef67

dldeef676#

对于我来说,用find尝试这个方法并不奏效,我发现最好的方法如下:

res := db.Model(&MyStruct{}).
        Where("id = ? AND key = ? AND value = 0", myID, myKey).
        First(&result)

    if errors.Is(res.Error, gorm.ErrRecordNotFound) {
      // user does not exists
    } else if res.Error != nil {
      // some other problem
        return res.Error
    }
ds97pgxw

ds97pgxw7#

这应该行得通:

var result bool

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

if result {
  // exists
} else {
  // does not exist
}

相关问题