登录
首页 >  Golang >  Go问答

如何将数组设置为 SQL 查询的参数

来源:stackoverflow

时间:2024-03-16 17:54:31 436浏览 收藏

在 Go 应用程序中进行 SQL 查询时,将数组作为参数传递可能会遇到问题。使用 go-clickhouse 包查询 ClickHouse 数据库时,直接使用 []string 或 []interface{} 类型作为数组参数会引发错误。为了解决此问题,需要使用 clickhouse.array() 函数将数组包装起来,并将 $n 参数更改为 ?。

问题内容

假设某个前端应用程序将带有此类正文的 post 请求发送到后端(go)应用程序:

{
    "city": "london",
    "gender": ["female", "male"],
    "has_family": [0, 1]
}

如您所见,请求正文有两个数组。我正在尝试将这些数组设置到 sql 查询中。就我而言,我对 clickhouse 数据库进行 sql 查询。我使用 go-clickhouse 包来完成此任务。

我尝试了这样的代码,但它引发了一个错误:

sql:转换参数 $2 类型:不支持的类型 []string,切片 字符串的

此外,我尝试将数据类型从 []string 更改为 []interface{}。不幸的是,在这种情况下,它会引发如下错误:

sql: 转换参数 $2 类型: 不支持的类型 []interface {}, a 界面切片

代码

var Controller = func(responseWriter http.ResponseWriter, request *http.Request) {
    type RequestBody struct {
        City string `json:"city"`
        Gender []string `json:"gender"`
        HasFamily []int `json:"has_family"`
    }

    requestBody := RequestBody{}

    decoder := json.NewDecoder(request.Body)

    if err := decoder.Decode(&requestBody); err != nil {
        fmt.Println(err)
        return
    }

    rows, err := database.ClickHouse.Query("SELECT * FROM TABLE_NAME WHERE lower(CITY) = lower($1) AND GENDER IN ($2) AND HAS_FAMILY IN ($3);", requestBody.City, requestBody.Gender, requestBody.HasFamily)
    if err != nil {
        fmt.Println(err)
        return
    }

    // other code
}

解决方案


尝试用 clickhouse.array() 包装 requestbody.genderrequestbody.hasfamily。并且尝试将 $n 更改为 ?

代码:

rows, err := database.ClickHouse.Query(
    "SELECT * FROM TABLE_NAME WHERE lower(CITY) = lower(?) AND GENDER IN (?) AND HAS_FAMILY IN (?);",
    requestBody.City,
    clickhouse.Array(requestBody.Gender),
    clickhouse.Array(requestBody.HasFamily),
)

更多信息:https://godoc.org/github.com/mailru/go-clickhouse#Array

今天关于《如何将数组设置为 SQL 查询的参数》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>