在 ORM 戈兰中实现过滤器

我正在开发一个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_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的答案,帮助我的是以一种我可以将其发送到gorm,map[字符串]接口{}的形式获取map[字符串][]字符串。


这个线程将同样有所帮助。


现在不再需要在过滤器中进行冗余检查或字符串操作


catspeake
浏览 69回答 1
1回答

潇潇雨雨

所以在我看来,你的问题有两个部分:您需要从网址中检索查询值,并且将它们插入到数据库查询中我不明白你是如何处理你的请求的,所以让我们假设你使用http包:从你得到URL对象,从调用该方法产生一个查询参数,用变量中的参数,让我们暂停一下,看看你如何用gorm进行查询:req.URLQuery()map[string][]stringURLQuerydb, 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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go