تهيئة العميل
استخدم 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_set–result_rowsأوresult_columns، بحسب اتجاه الاستعلام.column_names–Tupleيضم أسماء أعمدة النتائج.column_types–Tupleمن كائنات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).