clickhouse-cpp 是 ClickHouse 官方 C++ 客户端库,使用其原生二进制协议为 ClickHouse 提供快速且类型安全的接口。
构建说明、用法示例及更多文档可在该项目的 GitHub 仓库中找到:https://github.com/ClickHouse/clickhouse-cpp。
将该库集成到你的项目中
将该库集成到项目中的最简单方式,是使用 CMake 的 FetchContent
模块。这样你就可以锁定特定的库版本,并将其作为常规
CMake 工作流的一部分进行构建。
include(FetchContent)
set(WITH_OPENSSL YES CACHE BOOL "Enable OpenSSL in clickhouse-cpp" FORCE)
FetchContent_Declare(
clickhouse-cpp
GIT_REPOSITORY https://github.com/ClickHouse/clickhouse-cpp.git
GIT_TAG v2.6.0 # 也可以是 `master` 或其他分支
)
FetchContent_MakeAvailable(clickhouse-cpp)WITH_OPENSSL 选项会为库启用 TLS 支持,并且在连接到
ClickHouse Cloud 或其他启用了 SSL 的 ClickHouse 部署时是必需的。虽然对于非 TLS
连接可以省略,但通常仍建议启用。
构建带有 SSL 支持的版本需要先安装 OpenSSL 开发包。对于 Debian、Ubuntu 及其衍生版,请安装
libssl-dev;对于 Fedora、Red Hat,请安装 openssl-devel;对于 macOS,请使用 Homebrew 安装
openssl。
在该依赖可用后,将你的目标链接到导出的库目标:
target_link_libraries(your-target PRIVATE clickhouse-cpp-lib)示例
设置客户端对象
创建一个 Client 实例,以建立与 ClickHouse 的连接。以下示例
展示了如何连接到本地 ClickHouse 实例,此场景下无需密码,且未
启用 SSL。
#include <clickhouse/client.h>
clickhouse::Client client{clickhouse::ClientOptions().SetHost("localhost")};在更复杂的设置中,需要进行额外配置。以下示例演示了 如何使用多个附加参数连接到 ClickHouse Cloud 实例:
#include <clickhouse/client.h>
clickhouse::Client client{
clickhouse::ClientOptions{}
.SetHost("your.instance.clickhouse.cloud")
.SetUser("default")
.SetPassword("your-password")
.SetSSLOptions({}) // 启用 SSL
.SetPort(9440) // 通过 SSL 连接时,ClickHouse Cloud 使用端口 9440
};创建表并执行不返回数据的查询
要执行不返回任何数据的查询 (例如创建表) ,请使用 Execute 方法。
同样的方法也适用于 ALTER TABLE、DROP 等其他语句。
client.Execute(R"(
CREATE TABLE IF NOT EXISTS greetings (
id UInt64,
message String,
language String)
ENGINE = MergeTree ORDER BY id)");插入数据
要将数据插入表中,请构造一个 Block,并用与
表 schema 匹配的列对象填充它。数据会按列依次追加,然后通过
Insert 方法一次性插入,该方法针对高效批次写入进行了优化。
auto id = std::make_shared<clickhouse::ColumnUInt64>();
auto message = std::make_shared<clickhouse::ColumnString>();
auto language = std::make_shared<clickhouse::ColumnString>();
id->Append(1);
message->Append("Hello, World!");
language->Append("English");
id->Append(2);
message->Append("¡Hola, Mundo!");
language->Append("Spanish");
id->Append(3);
message->Append("Hallo wereld!");
language->Append("Dutch");
clickhouse::Block block{};
block.AppendColumn("id", id);
block.AppendColumn("message", message);
block.AppendColumn("language", language);
client.Insert("greetings", block);选择数据
要执行会返回数据的查询,请使用 Select 方法,并提供一个回调来处理结果。查询结果会以 Block 对象的形式返回,这体现了 ClickHouse 原生的列式数据表示。
client.Select(
"SELECT id, message, language FROM greetings",
[](const clickhouse::Block & block){
for (size_t i = 0; i < block.GetRowCount(); ++i) {
auto id = block[0]->AsStrict<clickhouse::ColumnUInt64>()->At(i);
auto message = block[1]->AsStrict<clickhouse::ColumnString>()->At(i);
auto language = block[2]->AsStrict<clickhouse::ColumnString>()->At(i);
std::cout << id << "\t" << message << "\t" << language << "\n";
}
});支持的数据类型
UInt8,UInt16,UInt32,UInt64,Int8,Int16,Int32,Int64UInt128,Int128Decimal32,Decimal64,Decimal128Float32,Float64DateDateTime,DateTime64DateTime([timezone]),DateTime64(N, [timezone])UUIDEnum8,Enum16StringFixedString(N)LowCardinality(String)和LowCardinality(FixedString(N))Nullable(T)Array(T)TupleMapIPv4,IPv6Point,Ring,Polygon,MultiPolygon