为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中构建动态(条件)WHERE SQL 查询

在 Golang 中构建动态(条件)WHERE SQL 查询

Go
皈依舞 2023-04-04 14:46:16
我正在使用 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 解决方法,但我认为在没有所有可能列的情况下构建查询会更有效。编辑:顺便说一句,为了让我的谷歌搜索查询更准确,我发现了一堆与我的问题相关的东西,可能我现在会尝试使用它。对于那些也感兴趣的人: old go playground example对 MySQL 数据库进行动态 SQL 查询gorp 包(片段听起来很有前途)
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

最终得到的解决方案

控制器

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)

模型


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


}



查看完整回答
反对 回复 2023-04-04
?
FFIVE

TA贡献1797条经验 获得超6个赞

在 orm 中GORM,我们这样做

if con1 {
    db.Where("con1 =?", con1Flag)
}

如果是你自己写的orm,我建议改成gorm。或者你可以参考你正在使用的orm,是否和上面的代码有相同的用法。如果您自己编写代码,请随心所欲。如果你在团队中工作,我想使用成熟的 orm 会更好


查看完整回答
反对 回复 2023-04-04
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

在 PostgreSQL 中

查询(字符串 sql,参数...)

在这里,当我以 Query(string,values) 的形式将值传递给 Query 时,它抛出一个错误,只添加了一个值,预期应该是 2,接口数组应该如何作为参数传递给 Query

我找到了答案:您需要将其作为 Query(string, values...)


查看完整回答
反对 回复 2023-04-04
  • 3 回答
  • 0 关注
  • 300 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信