Postgresql 使用Postgres更新Golang列

Postgresql 使用Postgres更新Golang列,postgresql,go,Postgresql,Go,假设我有一个表employments和一个结构Employment type Employment struct { ID int `json:"id"` Created_at string `json:"created_at"` Updated_at string `json:"updated_at"` Education string `json:"education"` Job

假设我有一个表
employments
和一个结构
Employment

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"`
}
用户可以更新他们的
工作
,问题是我不知道用户想要更新哪些字段

因此,我决定在输入结构上设置范围,以获取
非nil字段
来生成查询字符串,例如
更新员工设置位置=$1,收入=$2,其中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, ...)

如果您有任何想法或其他解决方法,请告诉我。

只需收集切片中的非零值,然后在执行查询时将该切片与
一起使用即可

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...)

只需收集一个切片中的非nil值,然后在执行查询时将该切片与
一起使用

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...)

SQL注入多少?这非常容易受到SQL注入攻击。至少你发布了什么代码。对不起,你说的@RayfenWindspear是什么意思?假设它来自某种类型的web表单。使用javascript或jQuery在前端管理表示“此字段是否已更新”的
bool
s匹配列表。然后您可以使用它来确定用户想要更新的内容。我也使用graphql go,所以我认为SQL注入不会有效,但在动态创建这样的SQL字符串时要小心,您可以肯定,字符串的每一部分都只来自您自己的代码内部,您完全可以控制。然后只将值传递给查询函数。SQL注入多少?这非常容易受到SQL注入攻击。至少你发布了什么代码。对不起,你说的@RayfenWindspear是什么意思?假设它来自某种类型的web表单。使用javascript或jQuery在前端管理表示“此字段是否已更新”的
bool
s匹配列表。然后您可以使用它来确定用户想要更新的内容。我也使用graphql go,所以我认为SQL注入不会有效,但在动态创建这样的SQL字符串时要小心,您可以肯定,字符串的每一部分都只来自您自己的代码内部,您完全可以控制。然后只将值传递给查询函数。是的,我错过了一个条件,顺便说一句,你解决了我的问题并节省了我的一天,非常感谢你,我错过了一个条件,顺便说一句,你解决了我的问题并节省了我的一天,非常感谢你