2015-05-20 10 views
9

official documentation dla GORM demonstruje, w jaki sposób można przetestować na istnienie rekordu, a mianowicie:Jak mogę sprawdzić błędy w operacjach CRUD przy użyciu 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 

ten może być wykorzystywany do testowania pośrednio za błędy w tworzeniu płyty, ale raporty żadnej użytecznej informacji w przypadku awarii.

Po sprawdzeniu source code for db.Create, nie wydaje się być pewnego rodzaju inspekcji stos klatek, które sprawdza błędów przed przystąpieniem, co oznacza, że ​​błędy transakcyjne zawiedzie cicho:

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

    if !scope.HasError() { 
     // actually perform the transaction 
    } 
} 
  • Jest to błąd, lub czy czegoś brakuje?
  • W jaki sposób mogę/powinienem zostać poinformowany o nieudanej transakcji?
  • Gdzie mogę uzyskać przydatne informacje dotyczące debugowania?
+0

nie mówi, że nie należą tutaj, ale czy próbował zadać to pytanie na github tego Gorm? –

Odpowiedz

9

DB.Create() zwraca nowy (sklonowanego) gorm.DB który jest struct i ma pole Error:

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

można przechowywać zwracanej wartości *gorm.DB i sprawdzić jego DB.Error pole tak:

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

Jeśli nie potrzebujesz niczego więcej od zwróconego gorm.DB, możesz bezpośrednio sprawdzić jego Error pola:

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

To sprawdzanie błędów nie działa przynajmniej z obecnym gadem. Zobacz odpowiedź @windyzboy i mój komentarz tam. – gavv

+0

@gavv Masz rację, to już nie działa. Próbowałem usunąć odpowiedź, ale nie mogę (ponieważ została ona zaakceptowana), więc po prostu edytuję ją. – icza

+0

Świetnie, dziękuję. – gavv

5

Próbowałem zaakceptowane odpowiedź, ale to nie działa, db.Error zawsze powrócić nil.

Wystarczy zmienić coś i to działa, mam nadzieję, że ktoś pomoże:

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

Prawidłowe. Przyjęta odpowiedź nie działa, ponieważ 'Create' zwraca klon' DB' i 'Error' pole jest ustawione w tym klonie zamiast oryginalnego obiektu. – gavv

Powiązane problemy