مرّر وسائط الكلمات المفتاحية لمصانع العميل وللطرائق التي تحتوي على العديد من المعلمات الاختيارية.الطرق غير الموثقة هنا لا تُعد جزءًا من واجهة برمجة التطبيقات، وقد تُزال أو تتغير.
تهيئة العميل
clickhouse_connect.get_client لإنشاء Client متزامن، أو ثبّت الإضافة async واستخدم await مع clickhouse_connect.get_async_client لإنشاء AsyncClient أصلي.
وسائط الاتصال
تقبل الدالة المُنشِئة غير المتزامنة أيضًا
connector_limit=100 وconnector_limit_per_host=20 وkeepalive_timeout=30.0 لتهيئة مجمّع اتصالات aiohttp الخاص بها. ولا تقبل pool_mgr. تقبل الواجهة الخلفية المتزامنة لـ chDB أيضًا path وchdb_options؛ راجع الواجهة الخلفية المضمنة لـ chDB.
وسائط HTTPS/TLS
وسيطة Settings
settings في get_client لتمرير إعدادات ClickHouse إضافية إلى الخادم مع كل طلب من العميل. لاحظ أنه في معظم الحالات، لا يمكن للمستخدمين الذين لديهم صلاحية وصول readonly=1 تعديل الإعدادات المرسلة مع الاستعلام، لذلك سيُسقط ClickHouse Connect هذه الإعدادات من الطلب النهائي ويسجل تحذيرًا. تنطبق الإعدادات التالية فقط على استعلامات/جلسات HTTP التي يستخدمها ClickHouse Connect، وليست موثقة باعتبارها إعدادات ClickHouse عامة.
للاطلاع على إعدادات ClickHouse الأخرى التي يمكن إرسالها مع كل استعلام، راجع وثائق ClickHouse.
أمثلة على إنشاء العميل
- من دون أي معلمات، سيتصل عميل ClickHouse Connect بمنفذ HTTP الافتراضي على
localhostباستخدام المستخدمdefaultومن دون كلمة مرور:
- الاتصال بخادم ClickHouse خارجي آمن عبر HTTPS
- الاتصال باستخدام معرّف جلسة ومعلمات اتصال مخصّصة أخرى وإعدادات ClickHouse.
الواجهة الخلفية المضمّنة لـ chDB
clickhouse-connect[chdb] لاستخدام الواجهة الخلفية التجريبية لـ chDB التي تعمل داخل العملية. وهي توفّر طرق العميل المتزامنة للاستعلام والإدراج والتدفّق وArrow:
path="/data/my_chdb" أو استخدم dsn="chdb:///data/my_chdb" للتخزين الدائم. تسمح الواجهة الخلفية بمسار محرك واحد لكل عملية، ولا تدعم get_async_client أو البيانات الخارجية.
دورة حياة العميل وأفضل الممارسات
المبادئ الأساسية
- أعِد استخدام العملاء: أنشئ العملاء مرة واحدة عند بدء تشغيل التطبيق، وأعِد استخدامهم طوال دورة حياة التطبيق
- تجنّب الإنشاء المتكرر: لا تُنشئ عميلاً جديدًا لكل query أو طلب
- نظّف الموارد بشكل صحيح: احرص دائمًا على إغلاق العملاء عند إيقاف التشغيل لتحرير موارد مجمع الاتصالات
- استخدم عميلاً واحدًا عند الإمكان: يمكن لعميل واحد معالجة العديد من الاستعلامات المتزامنة عبر مجمع الاتصالات الخاص به (راجع ملاحظات مؤشرات الترابط أدناه)
أنماط أساسية
التطبيقات متعددة الخيوط
التنظيف الصحيح
client.close() يحرّر العميل ويغلق اتصالات HTTP المجمّعة فقط عندما يكون العميل هو مالك مدير الـ pool الخاص به (على سبيل المثال، عند إنشائه باستخدام خيارات TLS/proxy مخصّصة). أمّا بالنسبة إلى الـ pool المشتركة الافتراضية، فاستخدم client.close_connections() لإغلاق الـ sockets بشكل استباقي؛ وإلا فستُسترد الاتصالات تلقائيًا عند انتهاء مهلة الخمول وعند خروج العملية.
متى تستخدم عدة عملاء
- خوادم مختلفة: عميل واحد لكل ClickHouse server أو عنقود
- بيانات اعتماد مختلفة: عملاء منفصلون لمستخدمين مختلفين أو لمستويات وصول مختلفة
- قواعد بيانات مختلفة: عندما تحتاج إلى العمل مع عدة قواعد بيانات
- جلسات معزولة: عندما تحتاج إلى جلسات منفصلة للجداول المؤقتة أو للإعدادات الخاصة بالجلسة
- عزل لكل خيط تنفيذ: عندما تحتاج خيوط التنفيذ إلى جلسات مستقلة (كما هو موضح أعلاه)
وسائط الطرق الشائعة
parameters وsettings الشائعتين أو كلتيهما. وتُشرح وسائط الكلمات المفتاحية هذه أدناه.
وسيطة Parameters
query* وcommand في ClickHouse Connect Client وسيطة keyword اختيارية باسم parameters، تُستخدم لربط تعبيرات بايثون بتعبير قيمة في ClickHouse. ويتوفر نوعان من هذا الربط.
الربط من جهة الخادم
{<name>:<datatype>}. مرِّر القيم في قاموس بايثون.
استخدم None في بايثون للقيم القابلة لأن تكون NULL. القيم المتداخلة None مدعومة داخل معاملات Array وTuple، وداخل القيم الحرفية Map عندما يُضبط dict_parameter_format على "map".
- الربط من جهة الخادم باستخدام قاموس بايثون، وقيمة DateTime، وقيمة نصية
الربط من جهة العميل
parameters قاموسًا أو تسلسلًا. ويستخدم الربط من جهة العميل تنسيق السلاسل بأسلوب “printf” في بايثون لإجراء استبدال المعلمات.
لاحظ أنه، بخلاف الربط من جهة الخادم، لا يعمل الربط من جهة العميل مع معرّفات قاعدة البيانات مثل أسماء قواعد البيانات أو الجداول أو الأعمدة، لأن التنسيق بأسلوب بايثون لا يستطيع التمييز بين الأنواع المختلفة من السلاسل، ولأنها تحتاج إلى تنسيق مختلف (backticks أو علامتا الاقتباس المزدوجتان لمعرّفات قاعدة البيانات، وعلامتا الاقتباس المفردتان لقيم البيانات).
- مثال باستخدام قاموس بايثون، وقيمة DateTime، وإفلات السلاسل
- مثال على تسلسل في بايثون (Tuple) وFloat64 وIPv4Address
يتعامل ربط Datetime مع القيم غير المزوّدة بمنطقة زمنية على أنها وقت الساعة. ينسّق العميل قيمة ولأغراض التوافق مع الإصدارات السابقة، فإن اسم المعلمة في القاموس الذي ينتهي بـ
datetime غير المزوّدة بمنطقة زمنية حرفيًا. يفسّرها ClickHouse باستخدام المنطقة الزمنية المُعلنة في عنصر نائب من جهة الخادم مثل {dt:DateTime('Europe/Berlin')}، ثم session_timezone عند تعيينها، ثم المنطقة الزمنية للخادم. تُحوَّل قيمة datetime المراعية للمنطقة الزمنية إلى المنطقة الزمنية المُعلنة في العنصر النائب عند وجودها، وإلا فإلى المنطقة الزمنية للخادم المُبلّغ عنها عند الاتصال. إذا كان إعداد session_timezone يختلف عن المنطقة الزمنية للخادم المُبلّغ عنها، فأعلن منطقة زمنية في العنصر النائب للحفاظ على اللحظة المقصودة للقيم المراعية للمنطقة الزمنية.للتوافق المؤقت مع التحويل المحلي للمضيف الأقدم، عيّن common.set_setting("naive_datetime_binding", "legacy") قبل ربط المعلمات. وللحفاظ على لحظة زمنية، أرفق tzinfo المقصودة بقيمة datetime قبل تمريرها كمعلمة. تفسّر عمليات الإدراج عبر client.insert قيم datetime غير المزوّدة بمنطقة زمنية وفق المنطقة الزمنية المحلية للعملية افتراضيًا. عيّن إعداد naive_datetime_insert العام إلى "server" لتفسيرها كوقت الساعة في المنطقة الزمنية للعمود، أو في المنطقة الزمنية للخادم إذا لم تكن للعمود منطقة زمنية. راجع كائنات datetime غير المراعية للمنطقة الزمنية.بالنسبة إلى العنصر النائب {value:DateTime64(precision)} من جهة الخادم، يحافظ النوع المُعلن تلقائيًا على دقة أجزاء الثانية، بما في ذلك داخل تلميحات Array وTuple.لا يحتوي الربط من جهة العميل باستخدام %s على نوع مُعلن. غلّف قيمة datetime داخل DT64Param عندما يجب تنسيقها بدقة أجزاء الثانية:_64 يطلب أيضًا تنسيق DateTime64 عندما لا يكون الاسم المنتهي بهذه اللاحقة موجودًا حرفيًا في الاستعلام.تُنسَّق معلمة datetime.time أو datetime.timedelta كقيمة حرفية [-]HH:MM:SS[.ffffff] لأعمدة ClickHouse Time وTime64، في أسلوبي الربط كليهما وداخل قيم Array وTuple. يضيف العميل علامتي الاقتباس، لذا لا تضع علامات اقتباس حول العنصر النائب في الاستعلام. قد تكون قيمة timedelta سالبة وقد تتجاوز 24 ساعة. تحتفظ قيمة Timedelta من pandas بالنانوثواني الخاصة بها وتُنسَّق بكسر من تسع خانات لـ Time64(9). تُتجاهل معلومات المنطقة الزمنية في قيمة time المراعية للمنطقة الزمنية لأن ClickHouse Time لا يحتوي على منطقة زمنية.وسيطة Settings
insert وselect الأساسية في ClickHouse Connect Client وسيطةً اختيارية باسم settings لتمرير إعدادات المستخدم الخاصة بخادم ClickHouse لعبارة SQL المضمَّنة. يجب أن تكون وسيطة settings قاموسًا. ويجب أن يتكوّن كل عنصر من اسم إعداد في ClickHouse والقيمة المرتبطة به. لاحظ أن القيم ستُحوَّل إلى سلاسل نصية عند إرسالها إلى الخادم كمعلمات استعلام.
وكما هو الحال مع الإعدادات على مستوى العميل، سيتجاهل ClickHouse Connect أي إعدادات يضع الخادم عليها العلامة readonly=1، مع تسجيل رسالة في السجل بذلك. أما الإعدادات التي تنطبق فقط على الاستعلامات عبر ClickHouse HTTP interface فتكون صالحة دائمًا. وتجد وصف هذه الإعدادات ضمن واجهة برمجة تطبيقات get_client واجهة برمجة تطبيقات.
مثال على استخدام إعدادات ClickHouse:
طريقة command في Client
Client.command مع التعليمات التي لا تُرجِع مجموعة بيانات جدولية، أو مع الاستعلامات التي تُرجِع قيمة بدائية واحدة أو صفًا واحدًا. وبحسب الاستجابة، فإنها تُرجِع سلسلة نصية، أو عددًا صحيحًا، أو تسلسلًا من السلاسل النصية، أو QuerySummary. وتُرجِع عملية القراءة التي تنتج مجموعة نتائج فارغة سلسلةً نصية فارغة.
أمثلة الأوامر
عبارات DDL
استعلامات بسيطة تُعيد قيماً مفردة
الأوامر ذات المعلمات
الأوامر ذات الإعدادات
طريقة query في Client
Client.query مجموعة بيانات جدولية بتنسيق ClickHouse Native وتُرجع QueryResult. تُحمَّل النتيجة الكاملة في الذاكرة عند الوصول إلى إحدى خصائص النتيجة. استخدم طريقة بث للنتائج التي لا ينبغي الاحتفاظ بها في الذاكرة.
أمثلة على الاستعلامات
استعلام بسيط
الوصول إلى نتائج الاستعلام
استعلام باستخدام معلمات جهة العميل
استعلام باستخدام معلمات على جانب الخادم
الاستعلام مع الإعدادات
كائن 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
أساليب Client للاستعلامات المتدفقة
طريقة insert في Client
Client.insert. وتقبل المعلمات التالية:
تعيد هذه الطريقة
QuerySummary. ويحتوي قاموس summary الخاص بها على القيم التي يبلّغ عنها الخادم. وتمثل written_rows خاصيةً تيسيرية، بينما تعيد written_bytes() وquery_id() القيم المناظرة. ويؤدي فشل الإدراج إلى رفع استثناء.
للاطلاع على طرق الإدراج المتخصصة التي تعمل مع Pandas DataFrames وPyArrow Tables وDataFrames المعتمدة على Arrow، راجع الإدراج المتقدم (طرق الإدراج المتخصصة).
تُعد مصفوفة NumPy أيضًا Sequence of Sequences صالحة، ويمكن استخدامها كوسيط
data مع طريقة insert الأساسية، لذلك لا حاجة إلى طريقة متخصصة.أمثلة
users مسبقًا، بمخطط (id UInt32, name String, age UInt8).
إدراج أساسي موجّه بالصفوف
إدراج موجّه بالأعمدة
إدراج باستخدام أنواع أعمدة صريحة
الإدراج في قاعدة بيانات محددة
الإدراج من الملفات
واجهة برمجة التطبيقات الخام
بايثون DB-API 2.0
clickhouse_connect.dbapi واجهة الاتصال والمُؤشِّر وفقًا للمعيار PEP 249. وهي تُعرِّف مستوى واجهة برمجة التطبيقات بأنه 2.0، وthreadsafety=2، وparamstyle="pyformat". وتوفّر الوحدة أيضًا مُنشئات الأنواع وفقًا للمعيار PEP 249، وهي Date وTime وTimestamp وBinary، والدوال DateFromTicks وTimeFromTicks وTimestampFromTicks.
Cursor.execute وCursor.executemany وسيطتَي الكلمات المفتاحية الإضافيتين settings وquery_formats. تمرّر settings إعدادات ClickHouse. وتطبّق query_formats تنسيقات القراءة حسب نوع ClickHouse عندما تُرجع العبارة صفوفًا، باستخدام التعيين نفسه المستخدم في Client.query. ويستخدم 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__.
الاستثناءات
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
clickhouse_connect.driver.binding لبناء استعلامات ClickHouse SQL وإفلاتها بشكل صحيح. وبالمثل، يمكن استخدام الدوال في الوحدة clickhouse_connect.driver.parser لتحليل أسماء أنواع بيانات ClickHouse.