How can I check for errors in CRUD operations using GORM?
Full error message
The official documentation for GORM demonstrates a way in which one can test for the existence of a record, i.e.:
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
This can be used to test indirectly for errors in record creation but reports no useful information in the event of a failure.
Having checked the source code for db.Create, there seems to be some sort of stack-frame inspection that checks for errors before proceeding, meaning that transactional errors will fail silently:
func Create(scope *Scope) {
defer scope.Trace(NowFunc())
if !scope.HasError() {
// actually perform the transaction
}
}
Is this a bug, or am I missing something?
How can/should I be informed of a failed transaction?
Where can I get useful debugging information?Solutionsource: stackoverflow \u2197
DB.Create() returns a new (cloned) gorm.DB which is a struct and has a field Error: type DB struct { Value interface{} Error error RowsAffected int64 // contains filtered or unexported fields } You can store the returned *gorm.DB value and check its DB.Error field like this: if dbc := db.Create(&user); dbc.Error != nil { // Create failed, do something e.g. return, panic etc. return } If you don't need anything else from the returned gorm.DB, you can directly check its Error field: if db.Create(&user).Error != nil { // Create failed, do something e.g. return, panic etc. return }
API access
Get this solution programmatically \u2014 free, no authentication.
curl https://depscope.dev/api/error/54a08896f5f551004876a808c9d03c7f9b63bf793a7fc69924afaeda861849bbhash \u00b7 54a08896f5f551004876a808c9d03c7f9b63bf793a7fc69924afaeda861849bb