go - 如何仅在 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)
}
解决方案
int 和 string 都具有默认值,因此如果您不为它们分配值,它们将填充它们的默认值(0 或“”)。因为它们总是被分配一个值,所以 omitempty 标签永远不会发挥作用。
这个问题的一个常见解决方案是让你的结构字段成为指针,如果没有设置指针,那么它是 nil。nil 值将触发 json marshaler 识别 omitempty 标记。当您插入数据库时,这些值也将为 null/nil。
您应该评估哪些字段需要一个值,哪些字段可以允许为空,以防您的数据库具有完整性约束。处理数据时,您还必须在代码中添加 nil 检查。
推荐阅读
- python-3.x - 当列宽发生变化时,tkinter treeview 不会调整宽度
- python - 从 mbox 文件中提取最后一封邮件
- qt - 在 QML 中可以在另一个文件/页面中创建动态对象组件吗?
- c# - 通过尝试从肥皂服务检索数据,HTTP 请求未经授权
- angular - Angular:根据单选按钮值更改更改复选框的选中状态
- c# - 是否有 CMD 或 C# 的命令来查找特定文件,然后将该文件复制到其他文件夹?
- tensorflow - FCN 训练和测试期间的不同图像尺寸
- android - 尝试编译 Cordova 时,会出现这样的错误
- python - 将字典值传递给散列函数
- node.js - 有没有办法点击无头镀铬?