我正在开发一个API,它接受过滤器的参数(如下所述)/api/endpoint?filter_key_1=filter_value_1&...我以前在春天工作过,其中标准API允许动态构建SQL查询,而不会有太多麻烦。在戈兰,我使用 gorm 来处理 ORM 操作。是否无论如何都可以在不编写冗余代码的情况下使用可选参数构建查询?例如:如果发送的请求是:/api/endpoint?fk_1=fv_1&fk_2=fv_2&fk_3=fv_3Query 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_1Query 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的答案,帮助我的是以一种我可以将其发送到gorm,map[字符串]接口{}的形式获取map[字符串][]字符串。这个线程将同样有所帮助。现在不再需要在过滤器中进行冗余检查或字符串操作
1 回答
潇潇雨雨
TA贡献1833条经验 获得超4个赞
所以在我看来,你的问题有两个部分:
您需要从网址中检索查询值,并且
将它们插入到数据库查询中
我不明白你是如何处理你的请求的,所以让我们假设你使用http包:从你得到URL对象,从调用该方法产生一个查询参数,用变量中的参数,让我们暂停一下,看看你如何用gorm进行查询:req.URL
Query()
map[string][]string
URLQuery
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)
- 1 回答
- 0 关注
- 68 浏览
添加回答
举报
0/150
提交
取消