在ORM golang中实现过滤器



我正在研究一个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个部分:

  1. 你需要从url和
  2. 中检索你的查询值
  3. 将它们插入到您的数据库查询

我不知道你是如何处理你的请求的,所以让我们假设你使用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)

你可以找到它在文档

相关内容

  • 没有找到相关文章

最新更新