Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

واجهة برمجة تطبيقات برنامج تشغيل ClickHouse Connect

تهيئة العميل

استخدم clickhouse_connect.get_client لإنشاء Client متزامن، أو ثبّت الإضافة async واستخدم await مع clickhouse_connect.get_async_client لإنشاء AsyncClient أصلي.

وسائط الاتصال

المعامل النوع القيمة الافتراضية الوصف
interface str "http" "http" أو "https". كما تقبل دالة الإنشاء المتزامنة أيضًا الواجهة الخلفية التجريبية "chdb".
host str "localhost" اسم مضيف خادم ClickHouse أو عنوان IP الخاص به.
port int أو None 8123 أو 8443 تكون القيمة الافتراضية 8123 لـ HTTP و8443 لـ HTTPS. ويؤدي تمرير None إلى استخدام القيمة الافتراضية.
username str أو None "default" اسم المستخدم في ClickHouse. ويُقبل أيضًا الاسمان المستعاران user وuser_name.
password str "" كلمة مرور username. لا تجمع بين المصادقة باسم المستخدم/كلمة المرور والمصادقة بالرمز المميز.
access_token str أو None None رمز وصول JWT الخاص بـ ClickHouse Cloud. لا يمكن استخدامه مع token_provider أو مصادقة اسم المستخدم/كلمة المرور.
token_provider callable أو None None دالة قابلة للاستدعاء توفّر JWT في البداية وبعد رفض المصادقة. يمكن استخدام موفّر غير متزامن مع get_async_client.
database str أو None الإعداد الافتراضي للمستخدم قاعدة البيانات الافتراضية. يؤدّي تمرير None إلى طلب قاعدة البيانات الافتراضية للمستخدم على الخادم.
secure bool أو str False تمكين HTTPS/TLS. كما يؤدي interface="https" أيضًا إلى استخدام HTTPS، وكذلك المنفذ 443 أو 8443 عندما لا يكون interface مُعيَّنًا.
dsn str أو None None URL الاتصال. تكون للوسيطات keyword الصريحة الأسبقية على القيم التي جرى parse لها من DSN. شفِّر المحارف المحجوزة بترميز النسبة المئوية في بيانات الاعتماد وأسماء قواعد البيانات.
settings dict أو None None إعدادات ClickHouse التي تُطبَّق على كل request يُرسله client.
headers dict أو None None رؤوس HTTP التي تُطبَّق على كل طلب، بما في ذلك تهيئة العميل. تُطبَّق رؤوس المستخدم بعد الإعدادات الافتراضية الخاصة بـ driver، ويمكنها تجاوزها.
compress bool أو str True فعِّل الضغط أو اختر "lz4" أو "zstd" أو "br" أو "gzip". اطّلع على الضغط.
query_limit int 0 حد الصفوف الافتراضي الذي يُضاف إلى الاستعلامات المؤهلة. يعني الصفر عدم وجود حد. مرِّر النتائج الكبيرة كتدفّق بدلًا من تحميلها كلها في الذاكرة.
query_retries int 2 عدد محاولات إعادة التنفيذ المسموح به لحالات فشل القراءة القابلة لإعادة المحاولة. لا تُعاد محاولة الأوامر وعمليات insert عمومًا لأن إعادة التنفيذ قد تؤدي إلى تكرار الآثار الجانبية.
connect_timeout int 10 مهلة الاتصال بالثواني.
send_receive_timeout int 300 مهلة قراءة الـsocket بالثواني.
client_name str أو None None بادئة تُضاف إلى HTTP User-Agent للتعرّف عليه في system.query_log.
session_id سلسلة نصية أو None يُنشأ للمزامنة معرّف جلسة ClickHouse صريح. تُنشئ clients المتزامنة هذا المعرّف افتراضيًا؛ أما clients غير المتزامنة فلا تُنشئه.
autogenerate_session_id قيمة منطقية أو None الإعداد العام للمتزامن، وFalse لغير المتزامن تجاوز الإنشاء التلقائي لمعرّف الجلسة. عطّل هذا الإعداد على client مشترك بين عمليات متزامنة، ما لم تكن حالة الجلسة مطلوبة.
autogenerate_query_id bool أو None إعداد عام، True تجاوز إنشاء معرّف UUID للاستعلام تلقائيًا.
http_proxy str أو None البيئة/default عنوان وكيل HTTP لكل client.
https_proxy str أو None البيئة/default عنوان وكيل HTTPS لكل عميل.
pool_mgr urllib3.PoolManager أو None الإعداد الافتراضي المشترك مدير pool مخصص للعميل المتزامن فقط.
tz_source str أو None "auto" مصدر المنطقة الزمنية البديل للأعمدة التي تفتقر إلى بيانات وصفية للمنطقة الزمنية: "auto"، "server"، أو "local".
tz_mode str أو None "naive_utc" سياسة نتائج UTC: "naive_utc"، أو "aware"، أو "schema". راجع المناطق الزمنية.
show_clickhouse_errors bool، سلسلة نصية منطقية، "scrub"، أو None True يتحكم في str(exc) لأخطاء الخادم وأخطاء النقل وStreamFailureError الذي يحدث أثناء البث. تتضمن القيمة True URL الطلب وذيل إصدار الخادم. تحتفظ "scrub" بنص خطأ SQL والاسم الرمزي، لكنها تحذف المضيف/‏URL وذيل (version ...). تُرجع False رسالة عامة (يبقى code مُعيَّنًا لأخطاء الخادم). تُقبل السلاسل المنطقية. وتؤدي السلاسل الأخرى إلى إثارة ProgrammingError. بالنسبة إلى أخطاء النقل، يظل __cause__ وآثار التتبع محتويَين على استثناء النقل الأصلي.
proxy_path str "" بادئة المسار المضافة إلى URL الخادم عند التوجيه عبر وكيل.
form_encode_query_params bool False ضع معلمات الاستعلام دائمًا في نص الطلب بترميز النموذج. وتُنقل حمولات المعلمات الكبيرة غير الثنائية تلقائيًا حتى عندما تكون هذه القيمة false.
rename_response_column str أو None None استراتيجية إعادة تسمية الأعمدة: "remove_prefix", "to_camelcase", "to_camelcase_without_prefix", "to_underscore", أو "to_underscore_without_prefix".

تقبل الدالة المُنشِئة غير المتزامنة أيضًا connector_limit=100 وconnector_limit_per_host=20 وkeepalive_timeout=30.0 لتهيئة مجمّع اتصالات aiohttp الخاص بها. ولا تقبل pool_mgr. تقبل الواجهة الخلفية المتزامنة لـ chDB أيضًا path وchdb_options؛ راجع الواجهة الخلفية المضمنة لـ chDB.

وسائط HTTPS/TLS

Parameter Type Default Description
verify bool or str True تحقّق من شهادة الخادم واسم المضيف. يفعّل verify="proxy" وضع TLS للوكيل.
ca_cert str or None None مسار حزمة شهادات CA. استخدم "certifi" لاختيار الحزمة المضمّنة مع package certifi.
client_cert str or None None شهادة عميل بتنسيق PEM، بما في ذلك الشهادات الوسيطة عند الحاجة.
client_cert_key str or None None مسار المفتاح الخاص عندما لا يكون المفتاح مضمنًا في client_cert.
server_host_name str or None None اسم المضيف في شهادة TLS/SNI عندما يختلف عن host، مثل المرور عبر نفق أو Private Endpoint.
tls_mode str or None None يستخدم "mutual" authentication عبر mutual TLS في ClickHouse. ويرسل "proxy" و"strict" الشهادة على طبقة TLS دون تفعيل headers الخاصة بمصادقة الشهادات في ClickHouse. وتتصرف القيمة الافتراضية None مثل "mutual" عند توفير شهادة عميل.

وسيطة Settings

أخيرًا، تُستخدم وسيطة settings في get_client لتمرير إعدادات ClickHouse إضافية إلى الخادم مع كل طلب من العميل. لاحظ أنه في معظم الحالات، لا يمكن للمستخدمين الذين لديهم صلاحية وصول readonly=1 تعديل الإعدادات المرسلة مع الاستعلام، لذلك سيُسقط ClickHouse Connect هذه الإعدادات من الطلب النهائي ويسجل تحذيرًا. تنطبق الإعدادات التالية فقط على استعلامات/جلسات HTTP التي يستخدمها ClickHouse Connect، وليست موثقة باعتبارها إعدادات ClickHouse عامة.

Setting Description
buffer_size حجم المخزن المؤقت لاستجابة HTTP على جهة الخادم، بالبايت.
session_id معرّف الجلسة المستخدم لربط الطلبات ذات الصلة. وهو مطلوب للجداول المؤقتة وحالة الجلسة.
compress اطلب من الخادم ضغط استجابة HTTP. يُدار هذا عادةً بواسطة خيار ضغط العميل.
decompress أخبر الخادم بفك ضغط request body. يُستخدم مع عمليات insert الخام المضغوطة مسبقًا.
quota_key مفتاح الحصة المرتبط بالطلب.
session_check اطلب من الخادم التحقق من وجود جلسة.
session_timeout مهلة خمول الجلسة بالثواني.
wait_end_of_query يخزّن الاستجابة بالكامل مؤقتًا على الخادم. يضبط العميل هذا عند الحاجة إلى معلومات الملخص غير المتدفقة.
query_id معرّف الاستعلام صريح للطلب.
client_protocol_version مستوى capability لبروتوكول العميل بتنسيق native. ويُتفاوض عليه تلقائيًا عادةً.
role دور ClickHouse المطلوب استخدامه للطلب/الجلسة.

للاطلاع على إعدادات ClickHouse الأخرى التي يمكن إرسالها مع كل استعلام، راجع وثائق ClickHouse.

أمثلة على إنشاء العميل

  • من دون أي معلمات، سيتصل عميل ClickHouse Connect بمنفذ HTTP الافتراضي على localhost باستخدام المستخدم default ومن دون كلمة مرور:
import clickhouse_connect

client = clickhouse_connect.get_client()
print(client.server_version)
  • الاتصال بخادم ClickHouse خارجي آمن عبر HTTPS
import clickhouse_connect

client = clickhouse_connect.get_client(
    host="play.clickhouse.com",
    secure=True,
    port=443,
    username="play",
    password="clickhouse",
)
print(client.command("SELECT timezone()"))
  • الاتصال باستخدام معرّف جلسة ومعلمات اتصال مخصّصة أخرى وإعدادات ClickHouse.
import clickhouse_connect

client = clickhouse_connect.get_client(
    host="play.clickhouse.com",
    username="play",
    password="clickhouse",
    port=443,
    secure=True,
    session_id="example_session_1",
    connect_timeout=15,
    database="github",
    settings={"distributed_ddl_task_timeout": 300},
)
print(client.database)
# Output: github

الواجهة الخلفية المضمّنة لـ chDB

ثبّت clickhouse-connect[chdb] لاستخدام الواجهة الخلفية التجريبية لـ chDB التي تعمل داخل العملية. وهي توفّر طرق العميل المتزامنة للاستعلام والإدراج والتدفّق وArrow:

import clickhouse_connect

with clickhouse_connect.get_client(interface="chdb") as client:
    result = client.query("SELECT sum(number) FROM numbers(10)")
    print(result.first_row)
    # Output: (45,)

الإعداد الافتراضي هو قاعدة بيانات داخل الذاكرة. مرِّر path="/data/my_chdb" أو استخدم dsn="chdb:///data/my_chdb" للتخزين الدائم. تسمح الواجهة الخلفية بمسار محرك واحد لكل عملية، ولا تدعم get_async_client أو البيانات الخارجية.

دورة حياة العميل وأفضل الممارسات

يُعَدّ إنشاء عميل ClickHouse Connect عملية مكلفة، إذ يتضمن إنشاء اتصال، واسترجاع البيانات الوصفية الخاصة بالخادم، وتهيئة الإعدادات. اتبع أفضل الممارسات التالية لتحقيق أفضل أداء:

المبادئ الأساسية

  • أعِد استخدام العملاء: أنشئ العملاء مرة واحدة عند بدء تشغيل التطبيق، وأعِد استخدامهم طوال دورة حياة التطبيق
  • تجنّب الإنشاء المتكرر: لا تُنشئ عميلاً جديدًا لكل query أو طلب
  • نظّف الموارد بشكل صحيح: احرص دائمًا على إغلاق العملاء عند إيقاف التشغيل لتحرير موارد مجمع الاتصالات
  • استخدم عميلاً واحدًا عند الإمكان: يمكن لعميل واحد معالجة العديد من الاستعلامات المتزامنة عبر مجمع الاتصالات الخاص به (راجع ملاحظات مؤشرات الترابط أدناه)

أنماط أساسية

أعِد استخدام عميل واحد:

import clickhouse_connect

# Create once at startup
client = clickhouse_connect.get_client(
    host="my-host",
    username="default",
    password="password",
)

# Reuse for all queries
for i in range(1000):
    result = client.query("SELECT count() FROM users")

# Close on shutdown
client.close()

تجنّب إنشاء clients بصورة متكررة:

# BAD: Creates 1000 clients with expensive initialization overhead
for i in range(1000):
    client = clickhouse_connect.get_client(
        host="my-host",
        username="default",
        password="password",
    )
    result = client.query("SELECT count() FROM users")
    client.close()

التطبيقات متعددة الخيوط

لمشاركة عميل بين خيوط متعددة بأمان:

import clickhouse_connect
import threading

# Option 1: Disable sessions (recommended for shared clients)
client = clickhouse_connect.get_client(
    host="my-host",
    username="default",
    password="password",
    autogenerate_session_id=False,
)

def worker(thread_id):
    # All threads can now safely use the same client
    result = client.query(f"SELECT {thread_id}")
    print(f"Thread {thread_id}: {result.result_rows[0][0]}")

threads = [threading.Thread(target=worker, args=(i,)) for i in range(10)]
for t in threads:
    t.start()
for t in threads:
    t.join()

client.close()

بديل عند الحاجة إلى الجلسات: إذا كنت بحاجة إلى جلسات (مثلًا، لاستخدام الجداول المؤقتة)، فأنشئ عميلًا منفصلًا لكل خيط تنفيذ:

def worker(thread_id):
    # Each thread gets its own client with isolated session
    client = clickhouse_connect.get_client(
        host="my-host",
        username="default",
        password="password",
    )
    client.command("CREATE TEMPORARY TABLE temp (id UInt32) ENGINE = Memory")
    # ... use temp table ...
    client.close()

التنظيف الصحيح

أغلق كائنات العميل دائمًا عند إيقاف التشغيل. لاحظ أن client.close() يحرّر العميل ويغلق اتصالات HTTP المجمّعة فقط عندما يكون العميل هو مالك مدير الـ pool الخاص به (على سبيل المثال، عند إنشائه باستخدام خيارات TLS/proxy مخصّصة). أمّا بالنسبة إلى الـ pool المشتركة الافتراضية، فاستخدم client.close_connections() لإغلاق الـ sockets بشكل استباقي؛ وإلا فستُسترد الاتصالات تلقائيًا عند انتهاء مهلة الخمول وعند خروج العملية.

client = clickhouse_connect.get_client(
    host="my-host",
    username="default",
    password="password",
)
try:
    result = client.query("SELECT 1")
finally:
    client.close()

أو استخدم مدير السياق:

with clickhouse_connect.get_client(
    host="my-host",
    username="default",
    password="password",
) as client:
    result = client.query("SELECT 1")

متى تستخدم عدة عملاء

يكون استخدام عدة عملاء مناسبًا في الحالات التالية:

  • خوادم مختلفة: عميل واحد لكل ClickHouse server أو عنقود
  • بيانات اعتماد مختلفة: عملاء منفصلون لمستخدمين مختلفين أو لمستويات وصول مختلفة
  • قواعد بيانات مختلفة: عندما تحتاج إلى العمل مع عدة قواعد بيانات
  • جلسات معزولة: عندما تحتاج إلى جلسات منفصلة للجداول المؤقتة أو للإعدادات الخاصة بالجلسة
  • عزل لكل خيط تنفيذ: عندما تحتاج خيوط التنفيذ إلى جلسات مستقلة (كما هو موضح أعلاه)

وسائط الطرق الشائعة

تستخدم عدة طرق في العميل إحدى وسيطتي parameters وsettings الشائعتين أو كلتيهما. وتُشرح وسائط الكلمات المفتاحية هذه أدناه.

وسيطة Parameters

تقبل طرائق query* وcommand في ClickHouse Connect Client وسيطة keyword اختيارية باسم parameters، تُستخدم لربط تعبيرات بايثون بتعبير قيمة في ClickHouse. ويتوفر نوعان من هذا الربط.

الربط من جهة الخادم

يدعم ClickHouse الربط من جهة الخادم لقيم الاستعلام. تُرسَل القيمة المربوطة منفصلةً عن الاستعلام كمعلمة HTTP. يستخدم ClickHouse Connect هذا الوضع عندما يكتشف تعبيرًا بالصيغة {<name>:<datatype>}. مرِّر القيم في قاموس بايثون.

يجب أن تكون أسماء المعلمات أسماء BareWord ASCII في ClickHouse. يقبل برنامج التشغيل الرمز $ في بداية الاسم أو داخله أو نهايته عندما يقبله الخادم، مثل {$tenant_id:String}. يُحجز مفتاح قاموس يبدأ وينتهي بـ $ وتكون قيمته مخزنًا مؤقتًا مثل bytes أو bytearray أو memoryview لاتفاقية المعلمات الثنائية الخام في ClickHouse Connect. إذا استُخدم مثل هذا المفتاح لمعلمة غير ثنائية من جهة الخادم، فاحصره في عنصر نائب واحد {name:Type}. يمكن لـ ClickHouse تحليل أسماء $tag$ المتكررة كوسوم Heredoc.

استخدم None في بايثون للقيم القابلة لأن تكون NULL. القيم المتداخلة None مدعومة داخل معلمات Array وTuple، وداخل القيم الحرفية Map عندما يُضبط dict_parameter_format على "map".

  • الربط من جهة الخادم باستخدام قاموس بايثون، وقيمة DateTime، وقيمة نصية
import datetime

my_date = datetime.datetime(2022, 10, 1, 15, 20, 5)

parameters = {
    "table": "my_table",
    "v1": my_date,
    "v2": "a string with a single quote'",
}
client.query(
    "SELECT * FROM {table:Identifier} "
    "WHERE date >= {v1:DateTime} AND string ILIKE {v2:String}",
    parameters=parameters,
)

وهذا يكافئ:

SELECT *
FROM my_table
WHERE date >= '2022-10-01 15:20:05'
  AND string ILIKE 'a string with a single quote\''

الربط من جهة العميل

يدعم ClickHouse Connect أيضًا ربط المعلمات من جهة العميل، ما يتيح مرونة أكبر عند إنشاء استعلامات SQL المعتمدة على القوالب. بالنسبة إلى الربط من جهة العميل، يجب أن تكون وسيطة parameters قاموسًا أو تسلسلًا. ويستخدم الربط من جهة العميل تنسيق السلاسل بأسلوب "printf" في بايثون لإجراء استبدال المعلمات.

لاحظ أنه، بخلاف الربط من جهة الخادم، لا يعمل الربط من جهة العميل مع معرّفات قاعدة البيانات مثل أسماء قواعد البيانات أو الجداول أو الأعمدة، لأن التنسيق بأسلوب بايثون لا يستطيع التمييز بين الأنواع المختلفة من السلاسل، ولأنها تحتاج إلى تنسيق مختلف (backticks أو علامتا الاقتباس المزدوجتان لمعرّفات قاعدة البيانات، وعلامتا الاقتباس المفردتان لقيم البيانات).

  • مثال باستخدام قاموس بايثون، وقيمة DateTime، وإفلات السلاسل
import datetime

my_date = datetime.datetime(2022, 10, 1, 15, 20, 5)

parameters = {"v1": my_date, "v2": "a string with a single quote'"}
client.query(
    "SELECT * FROM my_table "
    "WHERE date >= %(v1)s AND string ILIKE %(v2)s",
    parameters=parameters,
)

يؤدي ذلك إلى إنشاء الاستعلام التالي على الخادم:

SELECT *
FROM my_table
WHERE date >= '2022-10-01 15:20:05'
  AND string ILIKE 'a string with a single quote\''
  • مثال على تسلسل في بايثون (Tuple) وFloat64 وIPv4Address
import ipaddress

parameters = (35200.44, ipaddress.IPv4Address(0x443d04fe))
client.query(
    "SELECT * FROM some_table WHERE metric >= %s AND ip_address = %s",
    parameters=parameters,
)

يؤدي ذلك إلى إنشاء الاستعلام التالي على الخادم:

SELECT *
FROM some_table
WHERE metric >= 35200.44
  AND ip_address = '68.61.4.254'

وسيطة Settings

تقبل جميع طُرق insert وselect الأساسية في ClickHouse Connect Client وسيطةً اختيارية باسم settings لتمرير إعدادات المستخدم الخاصة بخادم ClickHouse لعبارة SQL المضمَّنة. يجب أن تكون وسيطة settings قاموسًا. ويجب أن يتكوّن كل عنصر من اسم إعداد في ClickHouse والقيمة المرتبطة به. لاحظ أن القيم ستُحوَّل إلى سلاسل نصية عند إرسالها إلى الخادم كمعلمات استعلام.

وكما هو الحال مع الإعدادات على مستوى العميل، سيتجاهل ClickHouse Connect أي إعدادات يضع الخادم عليها العلامة readonly=1، مع تسجيل رسالة في السجل بذلك. أما الإعدادات التي تنطبق فقط على الاستعلامات عبر ClickHouse HTTP interface فتكون صالحة دائمًا. وتجد وصف هذه الإعدادات ضمن واجهة برمجة تطبيقات get_client واجهة برمجة تطبيقات.

مثال على استخدام إعدادات ClickHouse:

settings = {
    "merge_tree_min_rows_for_concurrent_read": 65535,
    "session_id": "session_1234",
    "use_skip_indexes": False,
}
client.query(
    "SELECT event_type, sum(timeout) "
    "FROM event_errors WHERE event_time > '2022-08-01'",
    settings=settings,
)

طريقة command في Client

استخدم Client.command مع التعليمات التي لا تُرجِع مجموعة بيانات جدولية، أو مع الاستعلامات التي تُرجِع قيمة بدائية واحدة أو صفًا واحدًا. وبحسب الاستجابة، فإنها تُرجِع سلسلة نصية، أو عددًا صحيحًا، أو تسلسلًا من السلاسل النصية، أو QuerySummary. وتُرجِع عملية القراءة التي تنتج مجموعة نتائج فارغة سلسلةً نصية فارغة.

المعلمة النوع الافتراضي الوصف
cmd str Required تعليمة ClickHouse SQL تُرجِع قيمة واحدة أو صفًا واحدًا من القيم.
parameters dict or sequence None راجع وصف المعلمات.
data str or bytes None بيانات اختيارية لتضمينها مع الأمر كجسم طلب POST.
settings dict None راجع وصف الإعدادات.
use_database bool True استخدم قاعدة بيانات العميل (المحددة عند إنشاء العميل). وتعني False أن الأمر سيستخدم قاعدة البيانات الافتراضية في خادم ClickHouse للمستخدم المتصل.
external_data ExternalData None كائن ExternalData يحتوي على بيانات ملف أو بيانات ثنائية لاستخدامها مع الاستعلام. راجع الاستعلامات المتقدمة (البيانات الخارجية)
transport_settings dict None قاموس اختياري من ترويسات HTTP لتضمينها مع هذا الطلب. يُضاف كل زوج مفتاح-قيمة كترويسة HTTP (مثل {'X-Custom-Header': 'value'}). وهو مفيد لمصادقة الوكيل، أو تتبّع الطلبات، أو تمرير الترويسات التي تتطلبها البنية التحتية الوسيطة.

أمثلة الأوامر

عبارات DDL

import clickhouse_connect

client = clickhouse_connect.get_client()

# Create a table. A successful DDL returns QuerySummary.
summary = client.command(
    "CREATE TABLE test_command "
    "(col_1 String, col_2 DateTime) "
    "ENGINE MergeTree ORDER BY tuple()"
)
print(summary.query_id())

# Show table definition
result = client.command("SHOW CREATE TABLE test_command")
print(result)
# Output:
# CREATE TABLE default.test_command
# (
#     `col_1` String,
#     `col_2` DateTime
# )
# ENGINE = MergeTree
# ORDER BY tuple()

# Drop table
client.command("DROP TABLE test_command")

استعلامات بسيطة تُعيد قيماً مفردة

import clickhouse_connect

client = clickhouse_connect.get_client()

# Single value result
count = client.command("SELECT count() FROM system.tables")
print(count)

# Server version
version = client.command("SELECT version()")
print(version)

الأوامر ذات المعلمات

import clickhouse_connect

client = clickhouse_connect.get_client()

# Using client-side parameters
table_name = "system"
result = client.command(
    "SELECT count() FROM system.tables WHERE database = %(db)s",
    parameters={"db": table_name}
)

# Using server-side parameters
result = client.command(
    "SELECT count() FROM system.tables WHERE database = {db:String}",
    parameters={"db": "system"}
)

الأوامر ذات الإعدادات

import clickhouse_connect

client = clickhouse_connect.get_client()

# Execute command with specific settings
result = client.command(
    "OPTIMIZE TABLE large_table FINAL",
    settings={"optimize_throw_if_noop": 1}
)

طريقة query في Client

تسترجع Client.query مجموعة بيانات جدولية بتنسيق ClickHouse Native وتُرجع QueryResult. تُحمَّل النتيجة الكاملة في الذاكرة عند الوصول إلى إحدى خصائص النتيجة. استخدم طريقة بث للنتائج التي لا ينبغي الاحتفاظ بها في الذاكرة.

المعلمة النوع الافتراضي الوصف
query str مطلوب استعلام ClickHouse يُرجع نتيجة جدولية، وغالبًا ما يكون SELECT أو DESCRIBE. ويمكن حذفه عند توفيره بواسطة context.
parameters dict or sequence None راجع وسيط Parameters.
settings dict None راجع وسيط Settings.
query_formats dict None تنسيق القراءة حسب نوع ClickHouse. راجع تنسيقات القراءة.
column_formats dict None تنسيق القراءة حسب عمود النتيجة، بما في ذلك تعيينات تنسيق النوع Nested.
encoding str None ترميز أعمدة String. القيمة الافتراضية هي UTF-8.
use_none bool True إرجاع None لقيمة SQL NULL. وعندما تكون القيمة false، تُرجَع القيمة الافتراضية لـ NULL لهذا النوع. تختار طرق NumPy/Pandas قيمًا افتراضية تركّز على الأداء.
column_oriented bool False إرجاع النتيجة على هيئة أعمدة بدلًا من صفوف.
use_numpy bool False قراءة أعمدة النتائج المتوافقة إلى مصفوفات NumPy داخل QueryResult. يُفضَّل query_np عندما تكون النتيجة المطلوبة مصفوفة NumPy واحدة.
max_str_len int 0 مع use_numpy، استخدم dtype ثابت العرض من Unicode لأعمدة String حتى هذا الطول. تستخدم القيمة صفر object arrays.
context QueryContext None سياق استعلام قابل لإعادة الاستخدام. تتجاوز معاملات الطريقة الصريحة قيم السياق.
query_tz str or tzinfo None المنطقة الزمنية المُطبَّقة على جميع أعمدة النتائج من نوع DateTime وDateTime64.
column_tzs dict None تعيين المنطقة الزمنية لكل عمود.
external_data ExternalData None ملف خارجي أو بيانات ثنائية. راجع البيانات الخارجية.
transport_settings dict None HTTP headers تُضاف إلى هذا الطلب.
tz_mode str Client default تجاوز على مستوى الاستعلام لمعالجة المنطقة الزمنية بالقيم "naive_utc" أو "aware" أو "schema".

أمثلة على الاستعلامات

استعلام بسيط

import clickhouse_connect

client = clickhouse_connect.get_client()

# Simple SELECT query
result = client.query(
    "SELECT number, toString(number) AS label FROM numbers(3)"
)

# Access results as rows
for row in result.result_rows:
    print(row)
# Output:
# (0, '0')
# (1, '1')
# (2, '2')

# Access column names and types
print(result.column_names)
# Output: ('number', 'label')
print([col_type.name for col_type in result.column_types])
# Output: ['UInt64', 'String']

الوصول إلى نتائج الاستعلام

import clickhouse_connect

client = clickhouse_connect.get_client()

result = client.query("SELECT number, toString(number) AS str FROM system.numbers LIMIT 3")

# Row-oriented access (default)
print(result.result_rows)
# Output: [(0, '0'), (1, '1'), (2, '2')]

# Column-oriented access
print(result.result_columns)
# Output: [[0, 1, 2], ['0', '1', '2']]

# Named results (list of dictionaries)
for row_dict in result.named_results():
    print(row_dict)
# Output:
# {'number': 0, 'str': '0'}
# {'number': 1, 'str': '1'}
# {'number': 2, 'str': '2'}

# First row as dictionary
print(result.first_item)
# Output: {'number': 0, 'str': '0'}

# First row as tuple
print(result.first_row)
# Output: (0, '0')

استعلام باستخدام معلمات جهة العميل

import clickhouse_connect

client = clickhouse_connect.get_client()

# Using dictionary parameters (printf-style)
query = "SELECT * FROM system.tables WHERE database = %(db)s AND name LIKE %(pattern)s"
parameters = {"db": "system", "pattern": "%query%"}
result = client.query(query, parameters=parameters)

# Using tuple parameters
query = "SELECT * FROM system.tables WHERE database = %s LIMIT %s"
parameters = ("system", 5)
result = client.query(query, parameters=parameters)

استعلام باستخدام معلمات على جانب الخادم

import clickhouse_connect

client = clickhouse_connect.get_client()

# Server-side binding (more secure, better performance for SELECT queries)
query = "SELECT * FROM system.tables WHERE database = {db:String} AND name = {tbl:String}"
parameters = {"db": "system", "tbl": "query_log"}

result = client.query(query, parameters=parameters)

الاستعلام مع الإعدادات

import clickhouse_connect

client = clickhouse_connect.get_client()

# Pass ClickHouse settings with the query
result = client.query(
    "SELECT sum(number) FROM numbers(1000000)",
    settings={
        "max_block_size": 100000,
        "max_execution_time": 30
    }
)

كائن QueryResult

تُرجِع طريقة query الأساسية كائن QueryResult بالخصائص العامة التالية:

  • result_rows – مصفوفة النتائج منظَّمة على شكل صفوف.
  • result_columns – مصفوفة النتائج منظَّمة على شكل أعمدة.
  • result_setresult_rows أو result_columns، بحسب اتجاه الاستعلام.
  • column_namesTuple يضم أسماء أعمدة النتائج.
  • column_typesTuple من كائنات ClickHouseType.
  • row_count – عدد صفوف النتائج المُخزَّنة فعليًا.
  • query_id – معرّف الاستعلام الذي تم الإبلاغ عنه أو إنشاؤه للطلب. وتعني السلسلة الفارغة عدم توفر أي معرّف.
  • summary – قاموس مفكوك الترميز من ترويسة الاستجابة X-ClickHouse-Summary.
  • first_item – الصف الأول على هيئة قاموس، أو None إذا كانت النتيجة فارغة.
  • first_row – الصف الأول على هيئة تسلسل، أو None إذا كانت النتيجة فارغة.
  • column_block_stream وrow_block_stream وrows_stream – سياقات تدفق داخلية. استخدم بدلًا من ذلك طرق البث المقابلة في العميل.

راجع الاستعلامات المتدفقة للتعرّف على واجهات برمجة التطبيقات StreamContext المدعومة.

استهلاك نتائج الاستعلام باستخدام NumPy أو Pandas أو Arrow

يوفّر ClickHouse Connect طرق استعلام متخصصة لتنسيقات بيانات NumPy وPandas وArrow. للحصول على معلومات مفصلة حول استخدام هذه الطرق، بما في ذلك الأمثلة وإمكانات البث والتعامل المتقدم مع الأنواع، راجع الاستعلام المتقدم (استعلامات NumPy وPandas وArrow).

أساليب Client للاستعلامات المتدفقة

لبث مجموعات نتائج كبيرة، يوفّر ClickHouse Connect عدة أساليب للبث المتدفق. راجع الاستعلامات المتقدمة (الاستعلامات المتدفقة) للاطلاع على التفاصيل والأمثلة.

طريقة insert في Client

في حالة الاستخدام الشائعة المتمثلة في إدراج عدة سجلات في ClickHouse، تتوفر الطريقة Client.insert. وتقبل المعلمات التالية:

Parameter Type Default Description
table str Required الجدول المستهدف. ويُسمح باستخدام اسم مؤهل بقاعدة البيانات. ويمكن حذفه عند توفيره بواسطة context.
data Sequence of Sequences Required مصفوفة بيانات موجَّهة للصفوف أو موجَّهة للأعمدة. ويمكن توفيرها لاحقًا عبر InsertContext.
column_names str or Sequence[str] "*" الأعمدة المرتبة. يؤدي "*" إلى تنفيذ استعلام للبيانات الوصفية لاكتشاف كل عمود قابل للإدراج.
database str or None Client database قاعدة البيانات المستهدفة عندما لا يكون table مؤهلاً.
column_types Sequence[ClickHouseType] None أنواع الأعمدة الصريحة. وعند توفيرها، تتجنب استعلام البيانات الوصفية.
column_type_names Sequence[str] None أسماء أنواع ClickHouse الصريحة. وهي بديل لـ column_types.
column_oriented bool False يفسِّر data على أنها أعمدة بدلًا من صفوف.
settings dict None راجع وسيطة Settings.
context InsertContext None سياق إدراج قابل لإعادة الاستخدام. راجع InsertContexts.
transport_settings dict None ترويسات HTTP تُضاف إلى هذا الطلب.

تعيد هذه الطريقة QuerySummary. ويحتوي قاموس summary الخاص بها على القيم التي يبلّغ عنها الخادم. وتمثل written_rows خاصيةً تيسيرية، بينما تعيد written_bytes() وquery_id() القيم المناظرة. ويؤدي فشل الإدراج إلى رفع استثناء.

للاطلاع على طرق الإدراج المتخصصة التي تعمل مع Pandas DataFrames وPyArrow Tables وDataFrames المعتمدة على Arrow، راجع الإدراج المتقدم (طرق الإدراج المتخصصة).

أمثلة

تفترض الأمثلة الواردة أدناه وجود جدول users مسبقًا، بمخطط (id UInt32, name String, age UInt8).

إدراج أساسي موجّه بالصفوف

import clickhouse_connect

client = clickhouse_connect.get_client()

# Row-oriented data: each inner list is a row
data = [
    [13, "user_1", 25],
    [79, "user_2", 30],
]

client.insert("users", data, column_names=["id", "name", "age"])

إدراج موجّه بالأعمدة

import clickhouse_connect

client = clickhouse_connect.get_client()

# Column-oriented data: each inner list is a column
data = [
    [13, 79],  # id column
    ["user_1", "user_2"],  # name column
    [25, 30],  # age column
]

client.insert("users", data, column_names=["id", "name", "age"], column_oriented=True)

إدراج باستخدام أنواع أعمدة صريحة

import clickhouse_connect

client = clickhouse_connect.get_client()

# Useful when you want to avoid a DESCRIBE query to the server
data = [
    [13, "user_1", 25],
    [79, "user_2", 30],
]

client.insert(
    "users",
    data,
    column_names=["id", "name", "age"],
    column_type_names=["UInt32", "String", "UInt8"],
)

الإدراج في قاعدة بيانات محددة

import clickhouse_connect

client = clickhouse_connect.get_client()

data = [
    [13, "user_1", 25],
    [79, "user_2", 30],
]

# Insert into a table in a specific database
client.insert(
    "users",
    data,
    column_names=["id", "name", "age"],
    database="production",
)

الإدراج من الملفات

لإدراج البيانات مباشرةً من الملفات إلى جداول ClickHouse، راجع الإدراج المتقدم (الإدراج من الملفات).

واجهة برمجة التطبيقات الخام

للاطلاع على حالات الاستخدام المتقدمة التي تتطلب وصولًا مباشرًا إلى واجهات HTTP الخاصة بـ ClickHouse من دون تحويلات للأنواع، راجع الاستخدام المتقدم (واجهة برمجة التطبيقات الخام).

بايثون DB-API 2.0

تُنفِّذ وحدة clickhouse_connect.dbapi واجهة الاتصال والمُؤشِّر وفقًا للمعيار PEP 249. وهي تُعرِّف مستوى واجهة برمجة التطبيقات بأنه 2.0، وthreadsafety=2، وparamstyle="pyformat". وتوفّر الوحدة أيضًا مُنشئات الأنواع وفقًا للمعيار PEP 249، وهي Date وTime وTimestamp وBinary، والدوال DateFromTicks وTimeFromTicks وTimestampFromTicks.

from clickhouse_connect import dbapi

connection = dbapi.connect(
    host="localhost",
    username="default",
    password="password",
    database="default",
)
cursor = connection.cursor()

try:
    cursor.execute(
        "SELECT name FROM system.tables "
        "WHERE database = %(database)s ORDER BY name LIMIT 5",
        {"database": "system"},
    )
    print(cursor.description)
    print(cursor.fetchall())
finally:
    cursor.close()
    connection.close()

يقبل كلٌّ من Cursor.execute وCursor.executemany وسيطتَي الكلمات المفتاحية الإضافيتين settings وquery_formats. تمرّر settings إعدادات ClickHouse. وتطبّق query_formats تنسيقات القراءة حسب نوع ClickHouse عندما تُرجع العبارة صفوفًا، باستخدام التعيين نفسه المستخدم في Client.query. ويقبل Cursor.execute أيضًا الوسيطة pyformat_encoded التي تُمرَّر بالكلمات المفتاحية فقط. وتتبع قيمتها الافتراضية True عقد DB-API الخاص بـ pyformat. ويضبطها نمط SQLAlchemy على False عندما يُصدر مصرّف العبارة علامات نسبة مئوية خامًا، لذا ينبغي للتطبيقات عادةً عدم ضبطها. ويستخدم executemany مسار الإدراج المجمّع Native الخاص ببرنامج التشغيل لعبارات INSERT ... VALUES المتوافقة مع تسلسل صفوف مُخزَّن فعليًا. وتستهلك fetchone وfetchmany وfetchall النتيجة المُخزَّنة فعليًا الحالية.

يستمدّ Cursor.description القيمة null_ok من نوع كل عمود في النتيجة. وتُرجع الأنواع غير القابلة للقيم الفارغة False، بينما تُرجع الأنواع القابلة للقيم الفارغة True، بما في ذلك أغلفة Nullable وVariant وDynamic. وتعني None أن قابلية القيم الفارغة غير معروفة. عندما لا يُرجع استعلام يبدأ بـ SELECT أو WITH، مع تجاهل التعليقات البادئة، أي صفوف أو بيانات وصفية للأعمدة، يشغّل المؤشّر استعلام بيانات وصفية بـ LIMIT 0 لملء description. وإذا فشل استعلام البيانات الوصفية هذا، يُترك description فارغًا.

لا يوفّر ClickHouse معاملات تقليدية عبر واجهة HTTP هذه. وتُعدّ Connection.commit() وConnection.rollback() عمليتَي no-op. ولا تزال قواعد تزامن معرّف الجلسة تنطبق عند مشاركة الاتصال.

فئات ودوال الأدوات المساعدة

توفر الوحدات التالية أدوات مساعدة عامة إضافية تستخدمها التطبيقات العميلة.

يُعرض إصدار الحزمة المثبتة في السلسلة clickhouse_connect.__version__.

الاستثناءات

تُعرَّف الاستثناءات المخصّصة، بما في ذلك التسلسل الهرمي للاستثناءات في DB-API 2.0، في clickhouse_connect.driver.exceptions. ويوفّر كلٌّ من DatabaseError وOperationalError السمة الرقمية code التي تحمل رمز الخطأ في ClickHouse، والسمة name التي تحمل الاسم الرمزي مثل UNKNOWN_TABLE، بحيث يمكن للتطبيقات التفريع بناءً على exc.code بدلًا من تحليل الرسالة. تُضبط code حتى عند تعطيل show_clickhouse_errors، بينما تتطلب name تفاصيل الخطأ (True أو "scrub"). وتكون كلتاهما None عند عدم توفرهما، كما في أخطاء النقل. استخدم show_clickhouse_errors="scrub" عندما ينبغي للمستخدمين النهائيين رؤية أخطاء SQL دون معلومات عن المضيف أو إصدار الخادم. يتحكم الإعداد أيضًا في رسائل StreamFailureError أثناء التدفق ورسائل النقل العامة. وهو يتحكم في str(exc) فقط. تظل أخطاء النقل مرفقة باعتبارها __cause__، ويمكن أن تحتوي آثار التتبع على نص الخطأ الأصلي للمضيف أو URL أو المكتبة.

أدوات ClickHouse SQL

يمكن استخدام الدوال والفئة DT64Param في الوحدة clickhouse_connect.driver.binding لبناء استعلامات ClickHouse SQL وإفلاتها بشكل صحيح. وبالمثل، يمكن استخدام الدوال في الوحدة clickhouse_connect.driver.parser لتحليل أسماء أنواع بيانات ClickHouse.

حالات الاستخدام متعددة الخيوط، ومتعددة العمليات، وغير المتزامنة أو القائمة على الأحداث

للحصول على معلومات حول استخدام ClickHouse Connect في التطبيقات متعددة الخيوط، ومتعددة العمليات، وغير المتزامنة أو القائمة على الأحداث، راجع الاستخدام المتقدم (حالات الاستخدام متعددة الخيوط، ومتعددة العمليات، وغير المتزامنة أو القائمة على الأحداث).

AsyncClient

للاطلاع على الاستخدام الأصلي لـ asyncio، راجع الاستخدام المتقدم (AsyncClient).

إدارة معرّفات الجلسات في ClickHouse

للاطلاع على معلومات حول إدارة معرّفات جلسات ClickHouse في التطبيقات متعددة الخيوط أو المتزامنة، راجع الاستخدام المتقدم (إدارة معرّفات الجلسات في ClickHouse).

تخصيص مجمّع اتصالات HTTP

لمزيد من المعلومات حول تخصيص مجمّع اتصالات HTTP للتطبيقات الكبيرة متعددة الخيوط، راجع الاستخدام المتقدم (تخصيص مجمّع اتصالات HTTP).

Navigation