go gorm 更新的時候不會更新空字段

做個記錄,gorm在更新字段的時候,如果字符串字段是空的,那麼將不會更新到數據庫。

在使用gorm將一個字段更新爲空的時候,發現並不生效,不瞭解具體什麼原因,所以此時需要打開debug模式,查看原生SQL是如何執行的。
 
type Student struct {
Model
    Email       string  `form:"email" json:"email"`
Name string`form:"name"  json:"name"`
}

func(c *Content) update(content Content) (err) {
    err = db.Model(&Content{}).Debug().Where("id = ?", 123).Update(&content).Error
}
查看日誌便知,此時如果name爲空字符串,那麼update的sql語句中並不會set,後查閱,方知gorm對於空字符和0這種數據,認爲是不需要處理的,所以。。。

這邊暫時採用map[string]interface{}來進行更新

var curBadgeClaim *BadgeClaim
		getRes := uc.data.DB(ctx).Model(&badgeClaim).
			Where(BadgeClaim{ClaimData: &apiBadgeV1.ClaimData{UserId: badgeClaim.UserId, BadgeId: badgeClaim.BadgeId}}).
			Find(&curBadgeClaim)
		if getRes.Error != nil {
			err = getRes.Error
			return
		}
		if curBadgeClaim == nil || getRes.RowsAffected == 0 {
			err = uc.data.DB(ctx).Create(&badgeClaim).Error
			if err != nil {
				return
			}
			curBadgeClaim = badgeClaim
		} else {
			// 由於json:"err,omitempty" 空字符串不寫入,所以這邊單獨設置map
			updMap := map[string]interface{}{
				"claim_status":     badgeClaim.ClaimStatus,
				"claim_time":       badgeClaim.ClaimTime,
				"transaction_hash": badgeClaim.TransactionHash,
				"user_attrs":       badgeClaim.UserAttrs,
				"err":              badgeClaim.Err,
			}
			db := uc.data.DB(ctx).Model(&badgeClaim).
				Where(BadgeClaim{ClaimData: &apiBadgeV1.ClaimData{UserId: badgeClaim.UserId, BadgeId: badgeClaim.BadgeId}}).
				Updates(updMap)
			if db.Error != nil {
				uc.log.WithContext(ctx).Warnf(fmt.Sprintf("ClaimUsecase::Replace badgeClaim:%v  err:%v", badgeClaim, db.Error))
				err = db.Error
				return
			}
		}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章