第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何僅編輯數(shù)據(jù)庫中的某些字段而不是所有字段?

如何僅編輯數(shù)據(jù)庫中的某些字段而不是所有字段?

Go
慕慕森 2022-10-04 16:01:42
我有一個(gè)應(yīng)用程序在運(yùn)行中,并且有一個(gè)用于編輯用戶信息的終結(jié)點(diǎn)。但是我發(fā)現(xiàn)了一個(gè)問題,如果在json中看到空白信息(讓我們假設(shè)用戶只想編輯名稱,并將其他字段留空),數(shù)據(jù)將在數(shù)據(jù)庫中進(jìn)行編輯,空白信息將覆蓋數(shù)據(jù)庫信息,即使用戶不想編輯它們。如何使僅以 json 格式到達(dá)的字段在數(shù)據(jù)庫中進(jìn)行有效編輯?還是有更好的方法?我期待著知道!我的控制器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)}我的存儲(chǔ)庫(訪問數(shù)據(jù)庫)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貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊

我將動(dòng)態(tài)構(gòu)造 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語句”/驗(yàn)證提取到一個(gè)單獨(dú)的函數(shù)中。


查看完整回答
反對(duì) 回復(fù) 2022-10-04
  • 1 回答
  • 0 關(guān)注
  • 87 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)