簡體   English   中英

Select 與 GORM 存在

[英]Select exists with 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實例。

如果你想避免 ErrRecordNotFound 錯誤,你可以使用 Find like db.Limit(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

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

您可以嘗試以下方法

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

對我來說,用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
    }

那應該工作:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM