在 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.
现在过滤器中不再需要冗余检查或字符串操作
所以在我看来你的问题有两个部分:
- 您需要从 url 和
中检索查询值
- 将它们插入您的数据库查询
我不知道你是如何处理你的请求的,所以让我们假设你使用 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)
我正在开发一个 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.
现在过滤器中不再需要冗余检查或字符串操作
所以在我看来你的问题有两个部分:
- 您需要从 url 和 中检索查询值
- 将它们插入您的数据库查询
我不知道你是如何处理你的请求的,所以让我们假设你使用 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)