【问题标题】:How initialize the result of groupArray function of the ClickHouse to the array如何将 ClickHouse 的 groupArray 函数的结果初始化为数组
【发布时间】:2020-04-06 12:54:30
【问题描述】:

在我的 Go 应用程序中,我通过 clickhouse-go 包向 ClickHouse 数据库发出请求。我所做的这个查询总是只返回一条记录,它是一个整数数组。有什么方法可以将该结果初始化为 Go 中的数组?

var ids []int

ids, err := database.ClickHouse.Exec("SELECT groupArray(ID) FROM layers;")
if err != nil {
    fmt.Println(err)
}

我尝试了这样的代码,但它引发了错误:cannot assign Result to ids (type []int) in multiple assignment.

【问题讨论】:

    标签: go clickhouse clickhouse-go


    【解决方案1】:

    Exec 方法不返回行,它返回 driver.Resulterror

    func (stmt *stmt) Exec(args []driver.Value) (driver.Result, error)
                                                 ^^^^^^^^^^^^^
    

    并且,driver.Result 类型具有以下定义(已删除 cmets):

    type Result interface {
        LastInsertId() (int64, error)
        RowsAffected() (int64, error)
    }
    

    您正在寻找的是返回 driver.RowsQuery 方法:

    func (stmt *stmt) Query(args []driver.Value) (driver.Rows, error)
                                                  ^^^^^^^^^^^
    

    然后您可以遍历行以生成所需的数组。

    README.md 中列出了一个示例(在此处复制):

    rows, err := connect.Query("SELECT country_code, os_id, browser_id, categories, action_day, action_time FROM example")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    
    for rows.Next() {
        var (
            country               string
            os, browser           uint8
            categories            []int16
            actionDay, actionTime time.Time
        )
        if err := rows.Scan(&country, &os, &browser, &categories, &actionDay, &actionTime); err != nil {
            log.Fatal(err)
        }
        log.Printf("country: %s, os: %d, browser: %d, categories: %v, action_day: %s, action_time: %s", country, os, browser, categories, actionDay, actionTime)
    }
    

    希望有帮助!

    【讨论】:

    • 您好!我不需要返回行。我知道Query 方法返回行,但就我而言,我只需要返回一行。所以我认为这种方法在这里不合适。正如我之前所说的,ClickHouse 的groupArray 函数将整数数组作为一行返回。据我了解,这个包中只有两种方法:ExecQuery,对吧?
    • @NurzhanNogerbek:但是,Exec 方法不返回行,因此您需要使用 Query 方法来提取您想要的值。它也有一个 QueryContext 方法,但它也返回行。您可以在 Query 之上编写自己的包装方法并使用它。
    • 你能给我看一个QueryContext方法的例子吗?
    • @NurzhanNogerbek:检查一下:github.com/ClickHouse/clickhouse-go/blob/…
    • 我认为QueryRowContext 是我正在寻找的东西,但我不明白如何正确使用它。你觉得这个方法怎么样?
    猜你喜欢
    • 1970-01-01
    • 2014-04-23
    • 2017-01-14
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多