gendry icon indicating copy to clipboard operation
gendry copied to clipboard

NamedQuery support map

Open xiao-xiao-xiao opened this issue 3 years ago • 7 comments

xiao-xiao-xiao avatar May 11 '21 03:05 xiao-xiao-xiao

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

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

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

caibirdme avatar May 18 '21 08:05 caibirdme

感谢你的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

xiao-xiao-xiao avatar May 21 '21 10:05 xiao-xiao-xiao

什么情况下需要到处where呢

caibirdme avatar May 21 '21 10:05 caibirdme

什么情况下需要到处where呢

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

xiao-xiao-xiao avatar Jun 18 '21 07:06 xiao-xiao-xiao

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

twz915 avatar Aug 12 '23 00:08 twz915

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

caibirdme avatar Aug 14 '23 06:08 caibirdme

可以自己实现一个 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
}

twz915 avatar Aug 15 '23 04:08 twz915