2015-05-20 4 views
9

official documentation для GORM демонстрирует способ, в котором можно проверить на наличие записи, то есть:Как проверить ошибки в CRUD-операциях с помощью GORM?

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

не говорит, что она не принадлежит здесь, но вы пробовали задать этот вопрос на GitHub этого GORM? –

ответ

9

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

Эта проверка ошибок не работает, по крайней мере, с текущим gorm. См. Ответ от @windyzboy и мой комментарий там. – gavv

+0

@gavv Вы правы, это больше не работает. Я попытался удалить ответ, но не могу (потому что он принят), поэтому я просто его редактирую. – icza

+0

Отлично, спасибо. – gavv

5

Я попытался принятый ответ, но он не работает, db.Error всегда возвращают nil.

Просто что-то изменить, и это работает, надеюсь, это поможет кто-нибудь:

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

Правильно. Принятый ответ не работает, потому что 'Create' возвращает клон' DB' и 'Error' поле устанавливается в этом клоне вместо исходного объекта. – gavv