2017-08-22 50 views
0
Golang更新列

比方說,我有一個表employments和結構Employment與Postgres的

type Employment struct { 
    ID    int  `json:"id"` 
    Created_at  string `json:"created_at"` 
    Updated_at  string `json:"updated_at"` 
    Education  string `json:"education"` 
    Job    string `json:"job"` 
    Position  string `json:"position"` 
    Business_phone string `json:"business_phone"` 
    Next_payday  string `json:"next_payday"` 
    Employment_type int  `json:"employment_type"` 
    Income   float64 `json:"income"` 
    Additional  float64 `json:"additional"` 
} 

用戶可以更新他們employment,問題是我不知道哪些字段用戶要更新。

所以,我決定在範圍內輸入結構得到non nil fields生成的查詢字符串,如UPDATE employments SET position=$1, income=$2 WHERE id=$3

一些事這是我得到這個時候

func FlexibleUpdate(table_name string, str interface{}, cond string, ret string) string { 

    query := "UPDATE " + table_name + " SET " 
    j := 0 
    m := structs.Map(str) 

    for i := range m { 
     if m[i] != "" && m[i] != 0 && m[i] != 0.0 && { 
      j++ 
      query = query + strings.ToLower(i) + "=$" + strconv.Itoa(j) + "," 
     } 
    } 
    j++ 

    // adding conditions 
    if cond != "" { 
     query = query[:len(query)-1] + " WHERE " + cond + "=$" + strconv.Itoa(j) 
    } 

    // return values 
    if ret != "" { 
     query = query + " RETURNING " + ret 
    } 

    return query 
} 

我不知道如何輸入值分配給$1, $2, ...執行查詢

database.DB.QueryRow(query_string, value_1, value_2, ...) 

讓我知道如果你有任何想法或另一種方式與r解決它。

+0

SQL注入很多?這很容易受到SQL注入攻擊。至少就你發佈的代碼而言。 – RayfenWindspear

+0

對不起,你是什麼意思@RayfenWindspear? –

+0

假設這來自某種類型的Web表單。在前端使用javascript或jQuery管理表示「此字段已更新」的「bool」匹配列表。然後,您可以使用它來確定用戶想要更新的內容。 – RayfenWindspear

回答

1

只需收集切片中的非零值,然後在執行查詢時使用...

var values []interface{} 
for i := range m { 
    if v := m[i]; v != "" && v != 0 && v != 0.0 && /* you're missing a condition here */{ 
     j++ 
     query = query + strings.ToLower(i) + "=$" + strconv.Itoa(j) + "," 
     values = append(values, v) 
    } 
} 

// .... 

database.DB.QueryRow(query_string, values...) 
+0

是的,我錯過了那裏的一個條件,順便說一句,你解決了我的問題,並節省我的一天,這麼多 –