22

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
    }
}
  • これはバグですか、それとも何か不足していますか?
  • トランザクションの失敗をどのように通知することができますか?
  • 有用なデバッグ情報はどこで入手できますか?
4

3 に答える 3

27

DB.Create()であり、フィールドを持つ新しい (複製された)gorm.DBを返します。structError

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
}
于 2015-05-21T06:03:44.853 に答える
0

エラーの種類を確認したい場合は、それを実行してください。

if err := db.Create(&user).Error; err != nil {

  if errors.Is(err, gorm.ErrRecordNotFound) {
    fmt.Println(err.Error())
  }

  return

}
于 2021-07-31T05:34:45.293 に答える