clickhouse-cpp هي مكتبة العميل الرسمية لـ ClickHouse بلغة C++، وتوفّر
واجهة سريعة ومأمونة الأنواع لـ ClickHouse باستخدام بروتوكوله الثنائي الأصلي.
تعليمات البناء، وأمثلة الاستخدام، ووثائق إضافية متاحة في مستودع GitHub الخاص بالمشروع: https://github.com/ClickHouse/clickhouse-cpp.
تضمين المكتبة في مشروعك
أبسط طريقة لإدراج المكتبة في مشروعك هي استخدام وحدة
FetchContent الخاصة بـ CMake. يتيح لك هذا النهج تثبيت إصدار محدد بدقة من المكتبة وبناؤها كجزء من
سير عمل 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 ومرّر دالة ردّ نداء لمعالجة
النتيجة. تُعاد نتائج الاستعلام على هيئة كائنات 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