web-dev-qa-db-ja.com

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

これは、レコード作成のエラーを間接的にテストするために使用できますが、障害が発生した場合に役立つ情報は報告されません。

db.Create のソースコードをチェックした後、続行する前にエラーをチェックするある種のスタックフレーム検査があるようです。つまり、トランザクションエラーはサイレントに失敗します。

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

    if !scope.HasError() {
        // actually perform the transaction
    }
}
  • これはバグですか、それとも何かが足りませんか?
  • 失敗したトランザクションをどのように通知できますか/通知する必要がありますか?
  • 有用なデバッグ情報はどこで入手できますか?
17
blz

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
}
_
20
icza

受け入れられた答えを試しましたが、うまくいきません、db.Error常にnilを返します。

何かを変更するだけで機能します。誰かに役立つことを願っています。

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