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

我正在使用 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 包(片段听起来很有前途)


皈依舞
浏览 301回答 3
3回答

吃鸡游戏

最终得到的解决方案控制器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}

FFIVE

在 orm 中GORM,我们这样做if con1 {     db.Where("con1 =?", con1Flag) }如果是你自己写的orm,我建议改成gorm。或者你可以参考你正在使用的orm,是否和上面的代码有相同的用法。如果您自己编写代码,请随心所欲。如果你在团队中工作,我想使用成熟的 orm 会更好

肥皂起泡泡

在 PostgreSQL 中查询(字符串 sql,参数...)在这里,当我以 Query(string,values) 的形式将值传递给 Query 时,它抛出一个错误,只添加了一个值,预期应该是 2,接口数组应该如何作为参数传递给 Query我找到了答案:您需要将其作为 Query(string, values...)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go