如何使用 GORM 检查 CRUD 操作中的错误?
How can I check for errors in CRUD operations using GORM?
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
}
}
- 这是一个错误,还是我遗漏了什么?
- 如何can/should通知我交易失败?
- 从哪里可以获得有用的调试信息?
DB.Create()
returns a new (cloned) 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
}
我已经尝试了接受的答案,但它不起作用,db.Error
总是returnnil
。
只要改变一些东西就可以了,希望它能帮助别人:
if err := db.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
// Create failed, do something e.g. return, panic etc.
return
}
如果你想检查错误类型,就去做吧。
if err := db.Create(&user).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
fmt.Println(err.Error())
}
return
}
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
}
}
- 这是一个错误,还是我遗漏了什么?
- 如何can/should通知我交易失败?
- 从哪里可以获得有用的调试信息?
DB.Create()
returns a new (cloned) 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
}
我已经尝试了接受的答案,但它不起作用,db.Error
总是returnnil
。
只要改变一些东西就可以了,希望它能帮助别人:
if err := db.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
// Create failed, do something e.g. return, panic etc.
return
}
如果你想检查错误类型,就去做吧。
if err := db.Create(&user).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
fmt.Println(err.Error())
}
return
}