【问题标题】:How to set arrays as parameters of the SQL query如何将数组设置为 SQL 查询的参数
【发布时间】:2020-04-11 06:53:52
【问题描述】:

假设某个前端应用程序将带有此类正文的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
}

【问题讨论】:

    标签: sql go clickhouse


    【解决方案1】:

    尝试用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

    【讨论】:

    • 感谢您的重播!我试图测试你的代码,但它引发了一个错误:clickhouse: Code: 53, e.displayText() = DB::Exception: Type mismatch in IN or VALUES section. Expected: String. Got: Array (version 19.14.6.12 (official build))。我还注意到$1$2$3 引发了这样的错误:clickhouse: wrong placeholder count。这就是为什么我将它们更改为?。你对此有什么想法吗?
    • @NurzhanNogerbek 刚刚更新了我的答案。顺便说一句,你能分享一下表格方案吗?希望确保列的数据类型有效
    • @NurzhanNogerbek 关于$n,我检查了源代码,它不是有效的占位符语法。 ? 是图书馆使用的那个
    • CITY 列的数据类型为StringGender 列的数据类型也是StringHAS_FAMILY 列的数据类型为UInt8
    • @NurzhanNogerbek 我虽然 GenderHAS_FAMILYArray。如果不是数组,则需要使用分隔符 , 连接值
    猜你喜欢
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多