go clickhouse query

在 Go 中使用 clickhouse-go 查询 ClickHouse 数据库非常简单。以下是一个完整的示例,展示如何连接 ClickHouse 并执行查询操作。


1. 安装依赖

首先,安装 clickhouse-go

bash

复制

go get -u github.com/ClickHouse/clickhouse-go/v2

2. 示例代码

以下是一个完整的示例,展示如何连接 ClickHouse 并执行查询操作。

go

复制

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/ClickHouse/clickhouse-go/v2"
)

func main() {
    // 配置 ClickHouse 连接
    conn, err := clickhouse.Open(&clickhouse.Options{
        Addr: []string{"localhost:9000"},
        Auth: clickhouse.Auth{
            Database: "default",
            Username: "default",
            Password: "",
        },
    })
    if err != nil {
        log.Fatalf("Failed to connect to ClickHouse: %v", err)
    }

    // 测试连接
    ctx := context.Background()
    if err := conn.Ping(ctx); err != nil {
        log.Fatalf("Failed to ping ClickHouse: %v", err)
    }
    fmt.Println("Connected to ClickHouse!")

    // 查询数据
    rows, err := conn.Query(ctx, `
        SELECT id, name, created_at
        FROM example_table
        WHERE id > ?
    `, 5) // 使用参数化查询
    if err != nil {
        log.Fatalf("Failed to query data: %v", err)
    }
    defer rows.Close()

    // 遍历查询结果
    for rows.Next() {
        var (
            id        uint32
            name      string
            createdAt time.Time
        )
        if err := rows.Scan(&id, &name, &createdAt); err != nil {
            log.Fatalf("Failed to scan row: %v", err)
        }
        fmt.Printf("ID: %d, Name: %s, Created At: %s\n", id, name, createdAt)
    }

    // 检查遍历过程中是否有错误
    if err := rows.Err(); err != nil {
        log.Fatalf("Error during rows iteration: %v", err)
    }
}

3. 代码说明

  • 连接配置

    • Addr:ClickHouse 的地址和端口。

    • Auth:数据库名称、用户名和密码。

    • Ping:测试连接是否成功。

  • 查询数据

    • 使用 Query 方法执行 SQL 查询。

    • 支持参数化查询(如 ? 占位符)。

    • 使用 Scan 读取查询结果。

  • 遍历结果

    • 使用 rows.Next() 遍历每一行数据。

    • 使用 rows.Scan() 将数据解析到变量中。

    • 使用 rows.Err() 检查遍历过程中是否有错误。


4. 运行代码

确保 ClickHouse 服务已启动,并且 example_table 表存在(表结构见下文)。然后运行代码:

bash

复制

go run main.go

5. 表结构

假设 example_table 的表结构如下:

sql

复制

CREATE TABLE example_table (
    id UInt32,
    name String,
    created_at DateTime
) ENGINE = MergeTree()
ORDER BY (id);

6. 输出示例

如果 example_table 中有以下数据:

id name created_at
1 Alice 2023-10-01 12:00:00
2 Bob 2023-10-01 12:01:00
6 Charlie 2023-10-01 12:02:00

运行代码后,输出将类似于:

复制

Connected to ClickHouse!
ID: 6, Name: Charlie, Created At: 2023-10-01 12:02:00

7. 注意事项

  • 参数化查询

    • 使用 ? 占位符可以防止 SQL 注入。

    • 支持传递多个参数,例如 Query(ctx, "SELECT ... WHERE id > ? AND name = ?", 5, "Charlie")

  • 性能优化

    • 对于大数据集,可以使用 QueryContext 和 QueryRowContext 控制超时和取消。

    • 使用 AsyncInsert 提高插入性能。


8. 其他功能

clickhouse-go 还支持以下功能:

  • 批量插入:使用 PrepareBatch 和 Append

  • 压缩:支持数据压缩(如 LZ4 和 ZSTD)。

  • TLS 加密:支持安全的 TLS 连接。

你可能感兴趣的:(golang,clickhouse,开发语言)