为了账号安全,请及时绑定邮箱和手机立即绑定

如何仅编辑数据库中的某些字段而不是所有字段?

如何仅编辑数据库中的某些字段而不是所有字段?

Go
慕慕森 2022-10-04 16:01:42
我有一个应用程序在运行中,并且有一个用于编辑用户信息的终结点。但是我发现了一个问题,如果在json中看到空白信息(让我们假设用户只想编辑名称,并将其他字段留空),数据将在数据库中进行编辑,空白信息将覆盖数据库信息,即使用户不想编辑它们。如何使仅以 json 格式到达的字段在数据库中进行有效编辑?还是有更好的方法?我期待着知道!我的控制器func EditUser(w http.ResponseWriter, r *http.Request) {    params := mux.Vars(r)    userID, err := strconv.ParseUint(params["userID"], 10, 64)    if err != nil {        returns.ERROR(w, http.StatusInternalServerError, err)        return    }    userIDInToken, err := auth.ExtractUserID(r)    if err != nil {        returns.ERROR(w, http.StatusInternalServerError, err)        return    }    if userIDInToken != userID {        returns.ERROR(w, http.StatusForbidden, errors.New("you can't update other user"))        return    }    bodyRequest, err := ioutil.ReadAll(r.Body)    if err != nil {        returns.ERROR(w, http.StatusBadRequest, err)        return    }    var user models.User    if err := json.Unmarshal(bodyRequest, &user); err != nil {        returns.ERROR(w, http.StatusUnprocessableEntity, err)        return    }    db, err := db.ConnectToDB()    if err != nil {        returns.ERROR(w, http.StatusInternalServerError, err)        return    }    defer db.Close()    repository := repositories.NewUsersRepository(db)    if err := repository.UpdateUserInfo(userID, user); err != nil {        returns.ERROR(w, http.StatusInternalServerError, err)        return    }    returns.JSON_RESPONSE(w, http.StatusOK, nil)}我的存储库(访问数据库)func (repository Users) UpdateUserInfo(userID uint64, user models.User) error {    stmt, err := repository.db.Prepare(        "UPDATE user SET name = ?, cpf = ?, email = ?, password = ?, city = ?, state = ? WHERE id = ?")    if err != nil {        return err    }    defer stmt.Close()    if _, err := stmt.Exec(        user.Name,        user.CPF,        user.Email,        user.Password,        user.City,        user.State,        userID,    ); err != nil {        return err    }    return nil}
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

我将动态构造 UPDATE 语句以及需要编辑的字段切片,方法是在将其添加到切片之前检查字段是否不为空。


像这样:


func (repository Users) UpdateUserInfo(userID uint64, user User) error {

    fields := make([]string, 0)

    values := make([]string, 0)


    if user.Name != "" {

        values = append(values, user.Name)

        fields = append(fields, "name = ?")

    }

    if user.CPF != "" {

        values = append(values, user.CPF)

        fields = append(fields, "cpf = ?")

    }

    if user.Email != "" {

        values = append(values, user.Email)

        fields = append(fields, "email = ?")

    }

    if user.Password != "" {

        values = append(values, user.Password)

        fields = append(fields, "password = ?")

    }

    if user.City != "" {

        values = append(values, user.City)

        fields = append(fields, "city = ?")

    }

    if user.State != "" {

        values = append(values, user.State)

        fields = append(fields, "state = ?")

    }


    if len(fields) != 0 {

        return errors.New("no fields to update")

    }


    updateString := fmt.Sprintf("UPDATE user SET %s WHERE id = ?", strings.Join(fields, ","))

    stmt, err := repository.db.Prepare(updateString)

    if err != nil {

        return err

    }

    defer stmt.Close()


    if _, err := stmt.Exec(values...,userID); err != nil {

        return err

    }


    return nil

}

为了更干净的代码,我建议将“if语句”/验证提取到一个单独的函数中。


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号