![]()
もくじ
空のオブジェクトの判定
これで判定
existingTarget := dao.Object{}
err := tx.Model(&existingTarget).
Where("{条件文}")
First(&existingTarget).Error
と
if errors.Is(err, gorm.ErrRecordNotFound) {
// 空オブジェクトの時の処理
}
例
func insertIfNotExistsUserItem(tx *gorm.DB, rowUserItemName string) error {
// 既存のレコードを取得
existingTarget := dao.UserItem{}
err := tx.Model(&existingTarget).
Where("name = ?", rowUserItemName).
First(&existingTarget).Error
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return errors.Wrap(err, "error in insertIfNotExistsUserItem.First")
}
// 既存のレコードが存在しない場合のみINSERT文を実行
if errors.Is(err, gorm.ErrRecordNotFound) {
newDao := dao.UserItem{}
err := tx.Session(&gorm.Session{FullSaveAssociations: true}).
Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}},
DoUpdates: clause.AssignmentColumns([]string{"id", "name"}),
}).Create(newDao.ToDAOFromCSV(libs.SetULID(), userName)).Error
if err != nil {
return errors.Wrap(err, "error in insertIfNotExistsUserItem.Create")
}
}
return nil
}
空Collectionの判定
Find(&existingTargets).Errorとif len(existingTargets) != 0 {}の組み合わせ
existingTargets := []dao.Object{}
err := tx.Model(&existingTargets).
Where("条件文").
Find(&existingTargets).Error
if err != nil {
return errors.Wrap(err, "error in xxxxx.Find")
}
if len(existingTargets) != 0 {
// 空配列の時の処理
}
例
func deleteExistingUserItemByID(tx *gorm.DB, row *csv.UserItem, userItemID value.ID) error {
existingTargets := []dao.UserItem{}
err := tx.Model(&existingTargets).
Where("id = ?", userItemID).
Find(&existingTargets).Error
if err != nil {
return errors.Wrap(err, "error in deleteExistingUserItemByID.Find")
}
if len(existingTargets) != 0 {
// 既にレコードが存在する場合
// user_itemを削除して初期化してからitemsを新規作成
err = recreateUserItems(tx, existingTargets, row, UserItemID)
if err != nil {
return err
}
return nil
}
// レコードがない場合は新規作成
if err := createUserItemsByRow(tx, existingTargets, row, userItemID); err != nil {
return err
}
return nil
}
Collectionからのオブジェクト抽出方法
for rangeで抽出できる
for k, v := range ojects {
//
}
例
for idx, target := range existingTargets {
//
}

