2015-05-20 14 views
9

Il official documentation per GORM dimostra un modo in cui si può verificare l'esistenza di un record, vale a dire:Come posso verificare gli errori nelle operazioni CRUD usando 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 

Questo può essere usato per testare indirettamente per errori nella creazione di record, ma i rapporti alcuna informazione utile in caso di un fallimento.

aver controllato la source code for db.Create, sembra che ci sia una sorta di ispezione dello stack frame che verifica la presenza di errori prima di procedere, il che significa che gli errori transazionali falliranno in silenzio:

func Create(scope *Scope) { 
    defer scope.Trace(NowFunc()) 

    if !scope.HasError() { 
     // actually perform the transaction 
    } 
} 
  • È questo un bug, o mi sto perdendo qualcosa?
  • Come posso/devo essere informato di una transazione fallita?
  • Dove posso ottenere utili informazioni di debug?
+0

non dice che non appartiene qui, ma hai provato a fare questa domanda in un github di questa Gorm? –

risposta

9

DB.Create() restituisce un nuovo (clonato) gorm.DB quali è un struct ed ha un campo Error:

type DB struct { 
    Value  interface{} 
    Error  error 
    RowsAffected int64 
    // contains filtered or unexported fields 
} 

è possibile memorizzare il *gorm.DB valore restituito e controllarne la DB.Error campo come questo:

if dbc := db.Create(&user); dbc.Error != nil { 
    // Create failed, do something e.g. return, panic etc. 
    return 
} 

Se non hai bisogno di altro dal reso gorm.DB, puoi controllare direttamente il suo Error campo:

if db.Create(&user).Error != nil { 
    // Create failed, do something e.g. return, panic etc. 
    return 
} 
+1

Questo controllo degli errori non funziona almeno con gorm corrente. Vedi la risposta di @windyzboy e il mio commento lì. – gavv

+0

@gavv Hai ragione, questo non funziona più. Ho provato a cancellare la risposta, ma non posso (perché è accettata), quindi la modifico. – icza

+0

Ottimo, grazie. – gavv

5

ho cercato la risposta accettata, ma non funziona, db.Error ritornano sempre nil.

Basta cambiare qualcosa e funziona, spero che aiutare qualcuno:

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

corretto. La risposta accettata non funziona perché "Crea" restituisce un clone di "DB" e il campo "Errore" è impostato in quel clone anziché nell'oggetto originale. – gavv

Problemi correlati