golang高性能ClickHouse SQL客户端插件库clickhouse-go的使用
golang高性能ClickHouse SQL客户端插件库clickhouse-go的使用
clickhouse-go 是 ClickHouse 的 Golang SQL 数据库客户端库,提供高性能的数据访问能力。
主要特性
- 使用 ClickHouse 原生格式以获得最佳性能
- 支持原生 ClickHouse TCP 客户端-服务器协议
- 兼容
database/sql
接口 - 支持 HTTP 协议传输(实验性)
- 支持将行数据编组到结构体(ScanStruct, Select)
- 支持将结构体解组到行(AppendStruct)
- 连接池
- 故障转移和负载均衡
- 批量写入支持
- 异步插入支持
- 命名和数字占位符支持
- LZ4/ZSTD 压缩支持
- 外部数据
- 查询参数
安装
go get -u github.com/ClickHouse/clickhouse-go/v2
使用示例
原生接口(native interface)示例
conn, err := clickhouse.Open(&clickhouse.Options{
Addr: []string{"127.0.0.1:9000"},
Auth: clickhouse.Auth{
Database: "default",
Username: "default",
Password: "",
},
DialContext: func(ctx context.Context, addr string) (net.Conn, error) {
dialCount++
var d net.Dialer
return d.DialContext(ctx, "tcp", addr)
},
Debug: true,
Debugf: func(format string, v ...any) {
fmt.Printf(format+"\n", v...)
},
Settings: clickhouse.Settings{
"max_execution_time": 60,
},
Compression: &clickhouse.Compression{
Method: clickhouse.CompressionLZ4,
},
DialTimeout: time.Second * 30,
MaxOpenConns: 5,
MaxIdleConns: 5,
ConnMaxLifetime: time.Duration(10) * time.Minute,
ConnOpenStrategy: clickhouse.ConnOpenInOrder,
BlockBufferSize: 10,
MaxCompressionBuffer: 10240,
ClientInfo: clickhouse.ClientInfo{ // 可选
Products: []struct {
Name string
Version string
}{
{Name: "my-app", Version: "0.1"},
},
},
})
if err != nil {
return err
}
return conn.Ping(context.Background())
database/sql 接口示例
conn := clickhouse.OpenDB(&clickhouse.Options{
Addr: []string{"127.0.0.1:9999"},
Auth: clickhouse.Auth{
Database: "default",
Username: "default",
Password: "",
},
TLS: &tls.Config{
InsecureSkipVerify: true,
},
Settings: clickhouse.Settings{
"max_execution_time": 60,
},
DialTimeout: time.Second * 30,
Compression: &clickhouse.Compression{
Method: clickhouse.CompressionLZ4,
},
Debug: true,
BlockBufferSize: 10,
MaxCompressionBuffer: 10240,
ClientInfo: clickhouse.ClientInfo{ // 可选
Products: []struct {
Name string
Version string
}{
{Name: "my-app", Version: "0.1"},
},
},
})
conn.SetMaxIdleConns(5)
conn.SetMaxOpenConns(10)
conn.SetConnMaxLifetime(time.Hour)
DSN 连接字符串示例
clickhouse://username:password@host1:9000,host2:9000/database?dial_timeout=200ms&max_execution_time=60
批量写入示例
// 原生接口批量写入
batch, err := conn.PrepareBatch(context.Background(), "INSERT INTO example")
if err != nil {
return err
}
for i := 0; i < 1000; i++ {
err := batch.Append(
uint32(i),
"example string",
[]uint8{1, 2, 3},
time.Now(),
)
if err != nil {
return err
}
}
err = batch.Send()
if err != nil {
return err
}
// database/sql 接口批量写入
tx, err := conn.Begin()
if err != nil {
return err
}
stmt, err := tx.Prepare("INSERT INTO example (col1, col2) VALUES (?, ?)")
if err != nil {
return err
}
for i := 0; i < 1000; i++ {
if _, err := stmt.Exec(i, fmt.Sprintf("value %d", i)); err != nil {
return err
}
}
if err := tx.Commit(); err != nil {
return err
}
查询示例
// 原生接口查询
rows, err := conn.Query(context.Background(), "SELECT * FROM example WHERE col1 > @col1", clickhouse.Named("col1", 10))
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
var (
col1 uint32
col2 string
col3 []uint8
col4 time.Time
)
if err := rows.Scan(&col1, &col2, &col3, &col4); err != nil {
return err
}
fmt.Printf("row: col1=%d, col2=%s, col3=%v, col4=%s\n", col1, col2, col3, col4)
}
// database/sql 接口查询
rows, err := conn.Query("SELECT * FROM example WHERE col1 > ?", 10)
if err != nil {
return err
}
defer rows.Close()
for rows.Next() {
var (
col1 uint32
col2 string
col3 []uint8
col4 time.Time
)
if err := rows.Scan(&col1, &col2, &col3, &col4); err != nil {
return err
}
fmt.Printf("row: col1=%d, col2=%s, col3=%v, col4=%s\n", col1, col2, col3, col4)
}
性能对比
操作类型 | V1 版本 | V2 版本(std) | V2 版本(native) |
---|---|---|---|
读取 | 1.218s | 924.390ms | 675.721ms |
写入 | 1.899s | 1.177s | 699.203ms |
支持的 ClickHouse 和 Golang 版本
支持的 ClickHouse 版本
客户端测试针对 ClickHouse 当前支持的版本。
支持的 Golang 版本
客户端版本 | Golang 版本 |
---|---|
>= 2.0 <= 2.2 | 1.17, 1.18 |
>= 2.3 | 1.18.4+, 1.19 |
>= 2.14 | 1.20, 1.21 |
>= 2.19 | 1.21, 1.22 |
>= 2.28 | 1.22, 1.23 |
>= 2.29 | 1.21, 1.22, 1.23, 1.24 |
更多示例
更多使用示例可以参考官方仓库中的示例代码,包括批量操作、异步插入、结构体映射等高级用法。
更多关于golang高性能ClickHouse SQL客户端插件库clickhouse-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复