公式ドキュメント 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
}
}
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
}
_
受け入れられた答えを試しましたが、うまくいきません、db.Error
常にnil
を返します。
何かを変更するだけで機能します。誰かに役立つことを願っています。
if err := db.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
// Create failed, do something e.g. return, panic etc.
return
}