GORM的official documentation表明了一种可以测试记录是否存在的方法,即:
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
// returns true if record hasn’t been saved (primary key `Id` is blank)
db.NewRecord(user) // => true
db.Create(&user)
// will return false after `user` created
db.NewRecord(user) // => false
这可用于间接测试记录创建中的错误,但在发生故障时不报告任何有用信息。
检查source code for db.Create
之后,似乎有某种堆栈帧检查在继续之前检查错误,这意味着事务错误将无声地失败:
func Create(scope *Scope) {
defer scope.Trace(NowFunc())
if !scope.HasError() {
// actually perform the transaction
}
}
答案 0 :(得分:13)
DB.Create()
返回一个新的(已克隆的)gorm.DB
struct
,其字段为Error
:
type DB struct {
Value interface{}
Error error
RowsAffected int64
// contains filtered or unexported fields
}
您可以存储返回的*gorm.DB
值并检查其DB.Error
字段,如下所示:
if dbc := db.Create(&user); dbc.Error != nil {
// Create failed, do something e.g. return, panic etc.
return
}
如果您在退回的gorm.DB
中不需要任何其他内容,则可以直接查看其Error
字段:
if db.Create(&user).Error != nil {
// Create failed, do something e.g. return, panic etc.
return
}
答案 1 :(得分:10)
我已尝试接受的答案,但它不起作用,db.Error
始终返回nil
。
只需改变一些东西,它就会起作用,希望它有助于某人:
if err := db.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
// Create failed, do something e.g. return, panic etc.
return
}
答案 2 :(得分:0)
如果你想检查错误类型,就去做吧。
if err := db.Create(&user).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
fmt.Println(err.Error())
}
return
}