Select 存在于 GORM 中
Select exists with GORM
我想检查数据库中是否存在一行 table。我第一次使用这种方法:
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
实例。
您的 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)
如果你想避免 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
您可以尝试以下方法
var exists bool
err = db.Model(model).
Select("count(*) > 0").
Where("id = ?", id).
Find(&exists).
Error
我想检查数据库中是否存在一行 table。我第一次使用这种方法:
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
实例。
您的 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)
如果你想避免 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
您可以尝试以下方法
var exists bool
err = db.Model(model).
Select("count(*) > 0").
Where("id = ?", id).
Find(&exists).
Error