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 # can also be `master` or other banch
)
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({}) // Enable SSL
.SetPort(9440) // for connections over SSL ClickHouse Cloud uses port 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 并用与表模式匹配的列对象填充它。数据按列追加,然后使用 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, Int64
UInt128, Int128
Decimal32, Decimal64, Decimal128
Float32, Float64
Date
DateTime, DateTime64
DateTime([timezone]), DateTime64(N, [timezone])
UUID
Enum8, Enum16
String
FixedString(N)
LowCardinality(String) 和 LowCardinality(FixedString(N))
Nullable(T)
Array(T)
Tuple
Map
IPv4, IPv6
Point, Ring, Polygon, MultiPolygon