didi / gendry

a golang library for sql builder
Apache License 2.0
1.62k stars 195 forks source link

能否在查询条件中支持类似“?”的插值参数 #35

Closed chenbaiyu0414 closed 5 years ago

chenbaiyu0414 commented 5 years ago

目前对于map[string]interface{}类型的条件拼接我觉得很不错,但是在有些需求上还不能完全满足,希望可以添加。

比如在比较高版本的mysql上已经支持在innodb引擎中建立全文索引,而对应的查询语句则类似于 SELECT * FROM table1 WHERE MATCH(somecolumns) AGAINST('keyword' IN BOOLEAN MODE) AND someCondition

在这里语句中可能需要将参数使用插值的方式插入到条件中去,而目前的SQL拼接的where map结构中还不支持以下这种方式

where := map[string]interface{}{
    "MATCH(somecolumns) AGAINST(? IN BOOLEAN MODE)":"keyword",
}

由于还同时可能存在其他的普通的where条件,例如>, =等等,无法完全使用NamedQuery代替,所以希望能加入类似原生的sql.DB中查询语句可以使用以?为标记的插值参数的条件的支持

如果添加了以上需求,在构造查询条件时,类似

where := map[string]interface{}{
    "name = ?":"Bob",
    "age > ?":10,
    "country IN ?":[]string{"china","korea","japan"},
}

的条件语句可能会更加的容易理解

caibirdme commented 5 years ago

过长的sql语句还是建议用NamedQuery自己来写,因为如果你用map[string]interface{}来描述太长的sql语句,你作为用户几乎不太可能能确信gendry最终帮你生成的sql语句是什么。NamedQuery可以在任何时候使用,NamedQuery("select * from table_foo where age > {{age}} and MATCH(col_bar) AGAINST({{keyword}} IN BOOLEAN MODE)", map[string]interface{}{"age":5,"keyword":"xxx"}) 这种并不比map[string]interface{}写起来更复杂吧? 我认为map[string]interface{}适合用来描述简单的、可以用and连接起来的sql语句,剩下的还是建议使用namedquery

chenbaiyu0414 commented 5 years ago

在某些场景下,要根据条件的不同在SQL里and上不同的语句,这个时候NameQuery里的SQL可能还是需要大量的进行手动拼接,而当这种需求和较长的sql语句撞车,就只有求助于手动拼接SQL了,gendry无法解决

caibirdme commented 5 years ago

我理解你的需求了,你最终的sql语句可能需要根据上下文才能确定要哪些where条件,但是又是一个比较复杂的语句对吧。我们会认真考虑要不要做上这个功能,但是目前你还是只能先用NamedQuery手动拼接一下。等我们确定好了开发计划,会reopen这个issue