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 или другим развертываниям ClickHouse с поддержкой SSL. Хотя для подключений без TLS
его можно не использовать, в целом рекомендуется его включать.
Для сборки с поддержкой SSL необходимо установить пакеты разработки OpenSSL. Установите
libssl-dev в Debian, Ubuntu или их производных; openssl-devel в Fedora, Red Hat; или
openssl в macOS через Homebrew.
После установки зависимости свяжите свою цель с экспортируемой целью библиотеки:
target_link_libraries(your-target PRIVATE clickhouse-cpp-lib)Примеры
Настройка объекта Client
Создайте экземпляр 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 и передайте callback для обработки
результата. Результаты запроса возвращаются в виде объектов 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