首页 > 解决方案 > 如何仅在 BD 中更新我的结构中填写的字段?

问题描述

我有一个结构可以从用户那里获取数据并更新数据库中的信息。但是,如果用户让一个字段为空白,则进入 DB 的对应字段将为空白。我不希望这样,我只想编辑用户通知的字段。

我的模型:

type Business struct {
    Id           uint64 `json:"id,omitempty"`
    Company_name string `json:"company_name,omitempty"`
    Trading_name string `json:"trading_name,omitempty"`
    Facebook     string `json:"facebook,omitempty"`
    Instagram    string `json:"instagram,omitempty"`
    Tel          string `json:"tel,omitempty"`
    User_id      uint64 `json:"user_id,omitempty"`
}

我的控制器:

func EditBusinessInfo(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    businessIDParams, err := strconv.ParseUint(params["businessID"], 10, 64)
    if err != nil {
        returns.ERROR(w, http.StatusBadRequest, err)
        return
    }

    userIDInToken, err := auth.ExtractUserID(r)
    if err != nil {
        returns.ERROR(w, http.StatusInternalServerError, err)
        return
    }

    db, err := db.ConnectToDB()
    if err != nil {
        returns.ERROR(w, http.StatusInternalServerError, err)
        return
    }
    defer db.Close()

    repository := repositories.NewUsersRepository(db)
    businessInBD, err := repository.GetBusiness(businessIDParams)
    if err != nil {
        returns.ERROR(w, http.StatusInternalServerError, err)
        return
    }

    if userIDInToken != businessInBD.User_id {
        returns.ERROR(w, http.StatusUnauthorized, errors.New("você não pode editar a empresa de outra pessoa"))
        return
    }

    if businessIDParams != businessInBD.Id {
        returns.ERROR(w, http.StatusForbidden, errors.New("essa empresa não peertence a você"))
        return
    }

    bodyRequest, err := ioutil.ReadAll(r.Body)
    if err != nil {
        returns.ERROR(w, http.StatusBadRequest, err)
        return
    }

    var business models.Business

    if err := json.Unmarshal(bodyRequest, &business); err != nil {
        returns.ERROR(w, http.StatusUnprocessableEntity, err)
        return
    }

    if err := repository.EditBusinessInfo(userIDInToken, business); err != nil {
        returns.ERROR(w, http.StatusInternalServerError, err)
        return
    }

    returns.JSON_RESPONSE(w, http.StatusOK, nil)

}

标签: go

解决方案


int 和 string 都具有默认值,因此如果您不为它们分配值,它们将填充它们的默认值(0 或“”)。因为它们总是被分配一个值,所以 omitempty 标签永远不会发挥作用。

这个问题的一个常见解决方案是让你的结构字段成为指针,如果没有设置指针,那么它是 nil。nil 值将触发 json marshaler 识别 omitempty 标记。当您插入数据库时​​,这些值也将为 null/nil。

您应该评估哪些字段需要一个值,哪些字段可以允许为空,以防您的数据库具有完整性约束。处理数据时,您还必须在代码中添加 nil 检查。


推荐阅读