Go 如何对行进行部分更新方法

Go 如何对行进行部分更新方法,go,sqlx,Go,Sqlx,我正在尝试编写一个泛型函数来对行进行部分更新,以下是我目前得到的结果 func GetSetByUpdateOptions(x interface{}) (string, error) { t := reflect.TypeOf(x) v := reflect.ValueOf(x) if v.Kind() != reflect.Struct { return "", errors.New("invalid_options_tag") } r

我正在尝试编写一个泛型函数来对行进行部分更新,以下是我目前得到的结果

func GetSetByUpdateOptions(x interface{}) (string, error) {
    t := reflect.TypeOf(x)
    v := reflect.ValueOf(x)
    if v.Kind() != reflect.Struct {
        return "", errors.New("invalid_options_tag")
    }
    res := "SET "
    for i := 0; i < v.NumField(); i++ {
        setTemplate := "%s=%v, "
        field := t.Field(i).Tag.Get("sql_set")
        value := v.Field(i).Interface()
        // NEED TO CHECK VALUE HERE
        if field == "" {
            return "", errors.New("invalid_options_tag")
        }
        res += fmt.Sprintf(setTemplate, field, value)
    }
    return res, nil
}

type Optional struct {
    Field1 *int `set:"field1"` // might be nil if not set
    Field2 *int `set:"field2"` // might be nil if not set
}

func UpdateRow(o Optional) { // here because i want a partial update. field1 
    s, _ := GetSetByUpdateOptions(o)
    query := "UPDATE table SET status=" + s + " mtime=UNIX_TIMESTAMP(NOW()) WHERE id = ?"
    // update
}
func GetSetByUpdateOptions(x接口{})(字符串,错误){
t:=反射类型(x)
v:=反射值(x)
如果v.Kind()!=reflect.Struct{
返回“”,错误。新建(“无效的\u选项\u标记”)
}
res:=“设置”
对于i:=0;i

只是想知道如何定义输入类型,因为使用接口作为GetSetByUpdate选项的输入似乎不是一个好主意,以及如何过滤部分选项,因为我需要部分更新?

如果您的函数应该接受任何结构类型,那么使用
接口{}
作为输入类型是唯一的好主意。你问题的第二部分我并不完全清楚。可能显示示例输入和输出,或者尝试更具体一些。这容易受到SQL注入的影响。让GetSetByUpdateOptions返回一个带占位符的字符串、一个包含值的接口{}片段和一个错误。@例如,mkopriva,我只想要更新字段1,然后应该过滤字段2。@MaxHsu您需要一些机制来指示哪些字段要更新,哪些字段要忽略,如何操作取决于您自己。例如,您可以决定在更新中省略
nil
字段,这样任务就很简单了。。。但是,如果您需要能够将列更新为
NULL
,那么上述方法就不太合适了,因为
nil
是用于此目的的正确“值”。如果您的函数应该接受任何结构类型,那么使用
接口{}
作为输入类型是唯一的好主意。你问题的第二部分我并不完全清楚。可能显示示例输入和输出,或者尝试更具体一些。这容易受到SQL注入的影响。让GetSetByUpdateOptions返回一个带占位符的字符串、一个包含值的接口{}片段和一个错误。@例如,mkopriva,我只想要更新字段1,然后应该过滤字段2。@MaxHsu您需要一些机制来指示哪些字段要更新,哪些字段要忽略,如何操作取决于您自己。例如,您可以决定在更新中省略
nil
字段,这样任务就很简单了。。。但是,如果您还需要能够将列更新为
NULL
,那么上述方法就不太合适了,因为
nil
是用于此目的的正确“值”。