开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:ClickHouse 集成指南
ClickHouse 是一款由俄罗斯搜索引擎公司 Yandex 开发的开源列式存储数据库,专为海量数据实时分析设计。它以极致的查询性能和高吞吐写入能力著称,尤其擅长处理 PB 级别的结构化数据,并能在毫秒到秒级内完成复杂的聚合分析(如多维度统计、漏斗计算、用户行为分析等),是大数据分析、数据仓库、实时报表等场景的核心工具。
ClickHouse 的核心概念
ClickHouse 与其他数据库的差异
Docker 部署
docker pull bitnami/clickhouse:latest
docker run -itd \ --name clickhouse-server \ --network=app-tier \ -p 8123:8123 \ -p 9000:9000 \ -p 9004:9004 \ -e ALLOW_EMPTY_PASSWORD=no \ -e CLICKHOUSE_ADMIN_USER=default \ -e CLICKHOUSE_ADMIN_PASSWORD=123456 \ bitnami/clickhouse:latest
复制代码
在 Go Wind Admin 中使用 ClickHouse
我把 ClickHouse 的 SDK 封装了起来,并且提供了配置文件的支持,使用起来非常简单。
ClickHouse 支持 go 的 sql 标准库更新查询,但是,会有一些限制,比如不支持事务等。所以,想要完整的功能,还是需要使用 ClickHouse 的官方 SDK。因此,我们仅提供了原生的 ClickHouse SDK 封装。
首先,我们需要安装库:
go get github.com/tx7do/kratos-bootstrap/database/clickhouse
复制代码
接着在数据库的配置文件data.yaml中添加 ClickHouse 的配置:
data: clickhouse: addresses: - "localhost:9000" username: "default" password: "123456" database: "finances"
复制代码
添加好了配置之后,我们就可以在data包里面创建 Clickhouse 的客户端了:
package data
import ( "github.com/tx7do/kratos-bootstrap/database/clickhouse")
func NewClickHouseClient(logger log.Logger, cfg *conf.Bootstrap) *clickhouse.Client { cli, err := clickhouse.NewClient(logger, cfg) if err != nil { return nil } return cli}
复制代码
在data/init.go注入到 wire:
//go:build wireinject// +build wireinject
package data
import "github.com/google/wire"
var ProviderSet = wire.NewSet( NewClickHouseClient,)
复制代码
在这里,我们以股票的 K 线(蜡烛图)为实例,来讲解如何使用 ClickHouse。
首先,定义模型:
package data
import "time"
type Candle struct { Timestamp *time.Time `json:"timestamp" ch:"timestamp"` Symbol *string `json:"symbol" ch:"symbol"` Open *float64 `json:"open" ch:"open"` High *float64 `json:"high" ch:"high"` Low *float64 `json:"low" ch:"low"` Close *float64 `json:"close" ch:"close"` Volume *float64 `json:"volume" ch:"volume"`}
复制代码
最后,实现CandleRepo:
package data
import ( "github.com/go-kratos/kratos/v2/log" "github.com/tx7do/kratos-bootstrap/database/clickhouse")
const candleTableName = "candles"
type CandleRepo struct { client *clickhouse.Client log *log.Helper}
func NewCandleRepo(logger log.Logger, client *clickhouse.Client) *CandleRepo { repo := &CandleRepo{ log: log.NewHelper(log.With(logger, "module", "candle/ck/repo")), client: client, }
return repo}
func (r *CandleRepo) Create(ctx context.Context, req *Candle) error { if req == nil { return candleV1.ErrorBadRequest("request data is required") }
err := r.client.Insert(ctx, candleTableName, "", req) if err != nil { r.log.Errorf("create candle failed: %s", err.Error()) return candleV1.ErrorInternalServerError("create candle failed") } return nil}
复制代码
项目代码
评论