首页 文章

如何使用GORM检查CRUD操作中的错误?

提问于
浏览
13

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
    }
}
  • 这是一个错误,还是我错过了什么?

  • How can/should I be informed of a failed transaction?

  • 我在哪里可以获得有用的调试信息?

2 回答

  • 12

    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
    }
    
  • 10

    我已经尝试了接受的答案,但它不起作用, db.Error 总是返回 nil .

    只是改变一些东西,它的工作原理,希望它有助于某人:

    if err := db.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
       // Create failed, do something e.g. return, panic etc.
       return 
    }
    

相关问题