Go 如何在BD中仅更新my struct中填写的字段?

Go 如何在BD中仅更新my struct中填写的字段?,go,Go,我有一个结构从用户那里获取数据并更新数据库中的信息。但是,如果用户允许字段为空,则数据库中的对应字段将为空。我不想这样,我只想编辑用户通知的字段 我的模型: type Business struct { Id uint64 `json:"id,omitempty"` Company_name string `json:"company_name,omitempty"` Trading_name string `j

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

我的模型:

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)

}

int和string都有默认值,因此如果不给它们赋值,它们将被默认值0或0填充。因为它们总是有一个赋值,所以省略空标记永远不会起作用

这个问题的一个常见解决方案是将结构字段设置为指针,如果没有设置指针,则指针为零。然后,nil值将触发json封送拆收器识别空标记。当您插入DB时,这些值也将为null/nil

您应该评估哪些字段需要值,以及在数据库存在完整性约束的情况下哪些字段可以为空。在处理数据时,还必须在代码中添加nil检查