Golang ClickHouse
Fast client for the fastest database
Built for ClickHouse
go-clickhouse uses native ClickHouse protocol with column-oriented design.
Familiar API
Use well-known database/sql-like API to execute queries and scan results.
Query builder
Query data using struct-based models and flexible query builder.
Feature-rich
The client supports most ClickHouse types including Array and LowCardinality.
Migrations
Keep your database schema updated with Go and SQL-based migrations.
Production-ready
The client is battle-tested in production processing billions of spans at Uptrace.
package main
import (
	"context"
	"fmt"
	"time"
	"github.com/uptrace/go-clickhouse/ch"
	"github.com/uptrace/go-clickhouse/chdebug"
)
type Model struct {
	ch.CHModel `ch:"partition:toYYYYMM(time)"`
	ID   uint64
	Text string    `ch:",lc"`
	Time time.Time `ch:",pk"`
}
func main() {
	ctx := context.Background()
	db := ch.Connect(ch.WithDatabase("test"))
	db.AddQueryHook(chdebug.NewQueryHook(chdebug.WithVerbose(true)))
	if err := db.Ping(ctx); err != nil {
		panic(err)
	}
	var num int
	if err := db.QueryRowContext(ctx, "SELECT 123").Scan(&num); err != nil {
		panic(err)
	}
	fmt.Println(num)
	if err := db.ResetModel(ctx, (*Model)(nil)); err != nil {
		panic(err)
	}
	src := &Model{ID: 1, Text: "hello", Time: time.Now()}
	if _, err := db.NewInsert().Model(src).Exec(ctx); err != nil {
		panic(err)
	}
	dest := new(Model)
	if err := db.NewSelect().Model(dest).Where("id = ?", src.ID).Limit(1).Scan(ctx); err != nil {
		panic(err)
	}
	fmt.Println(dest)
}
