الانتقال إلى المحتوى الرئيسي
clickhouse-cpp هي مكتبة العميل الرسمية لـ ClickHouse بلغة C++، وتوفّر واجهة سريعة وآمنة نوعيًا لـ ClickHouse باستخدام بروتوكوله الثنائي الأصلي. إرشادات البناء وأمثلة الاستخدام ووثائق إضافية متاحة في مستودع GitHub الخاص بالمشروع: https://github.com/ClickHouse/clickhouse-cpp.
المكتبة قيد التطوير النشط. وعلى الرغم من أنها تدعم بالفعل الوظائف الأساسية في ClickHouse، فقد لا تكون بعض الميزات وأنواع البيانات مُنفَّذة بالكامل أو مدعومة بعد.ملاحظاتك قيّمة للغاية، وهي تساعد في توجيه أولويات الميزات الجديدة والتحسينات. إذا واجهت قيودًا أو وظائف مفقودة أو سلوكًا غير متوقع، فيُرجى مشاركة ملاحظاتك أو طلبات الميزات عبر متتبّع المشكلات على  https://github.com/ClickHouse/clickhouse-cpp/issues

تضمين المكتبة في مشروعك

أبسط طريقة لتضمين المكتبة في مشروعك هي استخدام الوحدة 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 ومرّر دالة 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, 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
آخر تعديل في ٢٥ يونيو ٢٠٢٦