我正在研究一个api,它接受过滤器的参数(如下所示)
/api/endpoint?filter_key_1=filter_value_1&...
我以前在spring上工作过,其中的标准API允许动态构建SQL查询,而不会有太多麻烦。在golang我使用ORM gorm处理操作。有没有办法在不编写冗余代码的情况下使用可选参数构建查询?
例如:如果发送的请求是:
/api/endpoint?fk_1=fv_1&fk_2=fv_2&fk_3=fv_3
Query generated should be :
select * from table where fk_1 = fv_1 AND fk_2 = fv_2 AND fk_3 = fv_3
但在以下情况下:
/api/endpoint?fk_1=fv_1
Query generated should be:
select * from table where fk_1 = fv_1
目前我的方法是检查每个变量是否存在,并将查询构建为字符串:
query:="select * from table where "
if fk_1 != ""{
query += "fk_1 = fv_1"
}
... and so on
但是这看起来很尴尬而且容易出错
任何帮助将不胜感激!由于
编辑基于@bjornaer的回答,帮助我获得map[string][]字符串的形式,我可以将相同的发送到gorm, map[string]接口{}。
这个线程将在相同的帮助。
现在不再需要在过滤器中进行冗余检查或字符串操作
所以在我看来你的问题有2个部分:
- 你需要从url和 中检索你的查询值
- 将它们插入到您的数据库查询
我不知道你是如何处理你的请求的,所以让我们假设你使用http包:从req.URL
你得到URL对象,从调用Query()
方法产生你的查询参数的map[string][]string
,在一个变量URLQuery
中,让我们暂停一下,看看你如何用gorm查询:
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
QueryFields: true,
})
在这里我打开一个sqlite,然后你可以传递一个变量引用来填充你的查询,例如:
result := db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users)
现在从上面的例子中,将变量替换为:
result := db.Where(map[string]interface{}URLQuery).Find(&users)
你可以找到它在文档