在 ORM golang 中实现过滤器

Implementing filters in ORM golang

我正在开发一个 api,它接受过滤器的参数(如下所示)

/api/endpoint?filter_key_1=filter_value_1&...

我之前曾在 spring 上工作过,其中条件 API 允许动态构建 SQL 查询而不会有太多麻烦。在 golang 中,我使用 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 的回答,对我有帮助的是获得 map[string][]string 的形式,我可以将其发送给 gorm,map[string]interface{}.

This thread will help in the same.

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

所以在我看来你的问题有两个部分:

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

我不知道你是如何处理你的请求的,所以让我们假设你使用 http package: from req.URL you get the URL object 并且调用 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)

you can find it in the docs