[英]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.