didi / gendry

a golang library for sql builder
Apache License 2.0
1.6k stars 191 forks source link

NamedQuery support map #117

Open xiao-xiao-xiao opened 3 years ago

caibirdme commented 3 years ago

感谢你的PR,但是经过考虑,觉得这个特性不适合合入主干,主要原因:

所以还是希望大家可以合理使用工具,namedquery手写,其它用where map

xiao-xiao-xiao commented 3 years ago

感谢你的PR,但是经过考虑,觉得这个特性不适合合入主干,主要原因:

  • NamedQuery希望用户直接写sql,而支持map展开其实和这个目的是相悖的
  • where map的namedquery里支持其实很复杂,map套map怎么办呢?

所以还是希望大家可以合理使用工具,namedquery手写,其它用where map

  1. 这个理解,不过能不能支持下复杂SQL参数不固定的情况呢? 目前仅仅使用map是不够用的。 类似提供where 条件的导出 BuildWhere(where map[string]interface{})(query string, args []interface{}, err error)
  2. map 嵌套map 从目前看, 仅仅只有_or 条件有这个嵌套, 其它情况报错或者不处理也行;

@caibirdme

caibirdme commented 3 years ago

什么情况下需要到处where呢

xiao-xiao-xiao commented 3 years ago

什么情况下需要到处where呢

一些场景下,需要使用动态参数,再加一些gendry不支持的条件, 譬如 select a from table where {{动态字段}} and find_in_set {{set}}; 像这种场景,用单纯的NamedQuery 写起来太复杂了。解决这种情况如果 NamedQuery 支持 map 解析,会简单很多, 使用导出where 也能解决此问题,而且更加灵活。 @caibirdme

twz915 commented 11 months ago

这个问题我遇到过,我在内部提供了 BuildWhere版本,类似于部分条件是动态的

caibirdme commented 11 months ago

可以给一些期望的input和output吗

twz915 commented 11 months ago

可以自己实现一个 BuildWhere,这样可以避免拼上有一部分动态的条件。 @xiao-xiao-xiao 示例如下:

// BuildWhere 生成 where 条件,避免手动拼sql
func BuildWhere(where map[string]any, addAnd bool) (cond string, vals []any, err error) {
    cond, vals, err = BuildSelect("x", where, nil)
    parts := strings.SplitN(cond, "WHERE", 2)
    if len(parts) == 2 {
        cond = strings.TrimSpace(parts[1])
    } else {
        cond = ""
    }
    if cond != "" && addAnd {
        cond = " AND " + cond
    }
    return
}