写点什么

开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:ClickHouse 集成指南

作者:喵个咪
  • 2025-12-27
    湖南
  • 本文字数:1635 字

    阅读完需:约 5 分钟

开箱即用的 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}
复制代码

项目代码


发布于: 刚刚阅读数: 3
用户头像

喵个咪

关注

还未添加个人签名 2025-12-16 加入

还未添加个人简介

评论

发布
暂无评论
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:ClickHouse集成指南_Go_喵个咪_InfoQ写作社区