猿问

选择与 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())

}

但我想通过编写原始 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


Qyouu
浏览 165回答 5
5回答

绝地无双

您可以尝试以下方法var exists bool err = db.Model(model).          Select("count(*) > 0").          Where("id = ?", id).          Find(&exists).          Error

喵喵时光机

如果你想避免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 errorexists := r.RowsAffected > 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)

汪汪一只猫

您可以检查是否存在的另一种方法是使用:Countcount := int64(0)err := db.Model(&MyStruct{}).    Where("id = ? AND key = ? AND value = 0", myID, myKey).    Count(&count).    Error// handle errorexists := count > 0

繁花如伊

也许是一个迟到的回复,但我想分享我发现的答案,有可能直接扫描到一个布尔。变量的名称应更改为大写字母以实现此目的。前任:var Found booldb.Raw("SELECT EXISTS(SELECT 1 FROM magic_table WHERE magic_field1 = ? AND magic_field2 = ? AND magic_field3 = ?) AS found",    valOfMagicField1, valOfMagicField2, valOfMagicField3).Scan(&Found)   
随时随地看视频慕课网APP

相关分类

Go
我要回答