为了账号安全,请及时绑定邮箱和手机立即绑定

选择与 GORM 一起存在

选择与 GORM 一起存在

Go
Qyouu 2022-08-15 10:06:42
我想检查数据库表中是否存在行。我首先使用这种方法:type MyStruct struct {    ID    uint32    Key   string    Value string}var result MyStructerr := db.    Where("id = ? AND `key` = ? AND `value` = 0", myID, myKey).    First(&result).    Errorif err != nil {    if err == gorm.ErrRecordNotFound {        logrus.Error("ErrRecordNotFound")    }    logrus.Errorf("Other DB error: %s", err.Error())}但我想通过编写原始 SQL 来实现此目的。我尝试了以下操作:var result booldb.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
查看完整描述

5 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

您可以尝试以下方法

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


查看完整回答
反对 回复 2022-08-15
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

如果你想避免ErrRecordNotFound错误,你可以使用Find like db。限制(1)。Find(&user),Find 方法同时接受结构和切片数据


r := db.

    Where("id = ? AND `key` = ? AND `value` = 0", myID, myKey).

    Limit(1).

    Find(&result)


r.Error

// handle error


exists := r.RowsAffected > 0


查看完整回答
反对 回复 2022-08-15
?
白衣非少年

TA贡献1155条经验 获得超0个赞

你应该是一个结构或切片,而不是一个布尔。更多信息请点击这里: https://gorm.io/docs/sql_builder.html#Raw-SQLresult


这应该有效:


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)


查看完整回答
反对 回复 2022-08-15
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

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


查看完整回答
反对 回复 2022-08-15
?
繁花如伊

TA贡献2012条经验 获得超12个赞

也许是一个迟到的回复,但我想分享我发现的答案,有可能直接扫描到一个布尔。变量的名称应更改为大写字母以实现此目的。


前任:


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)   


查看完整回答
反对 回复 2022-08-15
  • 5 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信