Go 如何将ClickHouse的groupArray函数的结果初始化为数组

Go 如何将ClickHouse的groupArray函数的结果初始化为数组,go,clickhouse,clickhouse-go,Go,Clickhouse,Clickhouse Go,在我的Go应用程序中,我通过软件包向ClickHouse数据库发出请求。我所做的这个查询总是只返回一条记录,它是一个整数数组。是否有任何方法可以将该结果初始化为Go中的数组 var ids []int ids, err := database.ClickHouse.Exec("SELECT groupArray(ID) FROM layers;") if err != nil { fmt.Println(err) } 我尝试了这样的代码,但它引发了一个错误:无法在多次赋值中将结果赋值

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

var ids []int

ids, err := database.ClickHouse.Exec("SELECT groupArray(ID) FROM layers;")
if err != nil {
    fmt.Println(err)
}
我尝试了这样的代码,但它引发了一个错误:无法在多次赋值中将结果赋值给ids type[]int。

该方法不返回行,而是返回driver.Result和error

并且,该类型已删除以下定义注释:

type Result interface {
    LastInsertId() (int64, error)
    RowsAffected() (int64, 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)
}

希望有帮助

你好!!我不需要返回行。我知道查询方法返回行,但在我的例子中,我只需要返回一行。所以我认为这种方法在这里是不合适的。正如我前面所说,ClickHouse的groupArray函数将整数数组作为一行返回。据我所知,在这个包中只有两个方法:Exec和Query,对吗?@nurzhanogerbek:但是,Exec方法不返回行,所以您需要使用Query方法来提取所需的值。它还有一个QueryContext方法,但也返回行。您可以在查询之上编写自己的包装器方法并使用它。请给我看一个QueryContext方法的示例好吗?@NurzhanNogerbek:检查这个:。我想这就是我要找的,但我不知道如何正确使用它。你觉得这个方法怎么样?
func (stmt *stmt) Query(args []driver.Value) (driver.Rows, error)
                                              ^^^^^^^^^^^
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)
}