我正在使用 golang、go_reform、PostgreSQL。我想做的是一个 REST 搜索实用程序,一切都很顺利,直到我遇到条件搜索查询。这里的“条件”意味着我在表中有 10 列要搜索,并且可能有大量的组合,所以我无法单独处理它们。我需要的是一个查询生成器,但我不明白如何在 Go 中实现它。目前我有这样的想法,但似乎效率不高
type Query struct {
Id *int64
FirstName *string
MiddleName *string
LastName *string
AreaId *int64
Birthday *time.Time
}
func (table *Query) Find() (*User) {
if table.Id != nil {
idstr := fmt.Sprintf("WHERE Id = %d AND ", table.Id)
}
else idstr := "WHERE "
}
if table.FirstName != "" {
firststr := fmt.Sprintf("FirstName = %s AND", table.FirstName)
}
else firststr := ""
}//and so on
这感觉真的很尴尬,所以我想知道是否有更好的方法来确定进入的字段Find()
并基于此构建 SQL 查询。 (实际上它以 JSON 形式出现并绑定到Query
结构,所以也许有一种没有结构的方法)。也可能有 SQL 解决方法,但我认为在没有所有可能的列的情况下构建查询会更有效。
EDIT:顺便说一句,为了让我的谷歌搜索查询更加准确,我发现了很多与我的问题相关的东西,也许我现在会尝试使用它。对于那些也感兴趣的人:旧的 go 游乐场示例 https://play.golang.org/p/QN0S_O4dqe
对 MySQL 数据库进行动态 SQL 查询 https://stackoverflow.com/questions/46859705/making-dynamic-queries-in-golang-and-mysql
戈尔普包 https://github.com/go-gorp/gorp(片段听起来很有希望)
所以,我找到了解决方案。非常感谢樱桃柠檬 https://stackoverflow.com/a/46859776/10360512,其代码非常适合我。
我最终得到的解决方案
控制器
func Find(c echo.Context) (err error) {
model := &models.Query{}
if err = c.Bind(model); err != nil {
return c.JSON(http.StatusInternalServerError, u.Message(false, "Bad request"))
}
resp := model.Find()
return c.JSON(http.StatusOK, resp)
Model
type Query map[string]interface{}
func (model Query) Find() (Query) {
var values []interface{}
var where []string
for k, v := range model {
values = append(values, v)
//MySQL Way: where = append(where, fmt.Sprintf("%s = ?", k))
where = append(where, fmt.Sprintf(`"%s" = %s`,k, "$" + strconv.Itoa(len(values))))
}
string := ("SELECT name FROM users WHERE " + strings.Join(where, " AND "))
//for testing purposes i didn't ran actual query, just print it in the console and returned JSON back
fmt.Println(string)
return model
}
更新:对于 PostgreSQL 用户(感谢 @mkopriva 和他的游乐场示例 https://play.golang.org/p/BlADhht9PwO),我可以让这个占位符在 PostgreSQL 上正常工作
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)