QueryContexts
QueryContext. يحتوي QueryContext على البُنى الأساسية المستخدمة لبناء الاستعلامات على قاعدة بيانات ClickHouse، بالإضافة إلى الإعدادات المستخدمة لمعالجة النتيجة وتحويلها إلى QueryResult أو أي بنية بيانات استجابة أخرى. ويشمل ذلك الاستعلام نفسه، والمعلمات، والإعدادات، وتنسيقات القراءة، وخصائص أخرى.
يمكن الحصول على QueryContext باستخدام طريقة العميل create_query_context. وتستقبل هذه الطريقة المعلمات نفسها التي تستقبلها طريقة الاستعلام الأساسية. ويمكن بعد ذلك تمرير سياق الاستعلام هذا إلى الطرق query أو query_df أو query_np باعتباره وسيط الكلمة المفتاحية context بدلًا من أي من الوسائط الأخرى لهذه الطرق أو جميعها. لاحظ أن أي وسائط إضافية تُحدَّد عند استدعاء الطريقة ستتجاوز أي خصائص في QueryContext.
أوضح Use case لـ QueryContext هو إرسال الاستعلام نفسه مع قيم مختلفة لمَعلمات الربط. ويمكن تحديث جميع قيم المعلمات باستدعاء الطريقة QueryContext.set_parameters باستخدام قاموس، كما يمكن تحديث أي قيمة مفردة باستدعاء QueryContext.set_parameter باستخدام زوج key وvalue المطلوب.
QueryContext ليست آمنة للاستخدام عبر الخيوط، ولكن يمكن الحصول على نسخة منها في بيئة متعددة الخيوط عبر استدعاء التابع QueryContext.updated_copy.
الاستعلامات المتدفقة
query_column_block_stream— يعيد بيانات query في كتل على هيئة تسلسل من الأعمدة باستخدام كائنات بايثون الأصليةquery_row_block_stream— يعيد بيانات query على هيئة كتلة من الصفوف باستخدام كائنات بايثون الأصليةquery_rows_stream— يعيد بيانات query كتسلسل من الصفوف باستخدام كائنات بايثون الأصليةquery_np_stream— يعيد كل كتلة من بيانات query في ClickHouse كمصفوفة NumPyquery_df_stream— يعيد كل كتلة من بيانات query في ClickHouse على هيئة Pandas DataFramequery_arrow_stream— يعيد بيانات query على هيئة كائنات PyArrowRecordBatchquery_df_arrow_stream— يعيد كل دفعة Arrow على هيئة Pandas DataFrame أو Polars DataFrame، ويُحدَّد ذلك بواسطةdataframe_library
StreamContext، ويجب فتحه باستخدام عبارة with. وتُنتظر طرق التدفق في العميل غير المتزامن وتُفتح باستخدام async with.
كتل البيانات
query الأساسية كتدفق من الكتل التي يتلقاها من خادم ClickHouse. وتُنقل هذه الكتل من ClickHouse وإليه باستخدام تنسيق “Native” المخصص. والـ”كتلة” هي ببساطة تسلسل من أعمدة البيانات الثنائية، حيث يحتوي كل عمود على عدد متساوٍ من قيم البيانات من نوع البيانات المحدد. (وبما أن ClickHouse قاعدة بيانات عمودية، فهو يخزّن هذه البيانات بصيغة مشابهة.) ويتحكم في حجم الكتلة المُعادة من الاستعلام إعدادان للمستخدم يمكن ضبطهما على عدة مستويات (ملف تعريف المستخدم، أو المستخدم، أو الجلسة، أو الاستعلام). وهما:
- max_block_size — الحد الأقصى لحجم الكتلة بالصفوف.
- preferred_block_size_bytes — حجم الكتلة المفضّل بالبايت.
preferred_block_size_bytes، لن تتجاوز أي كتلة أبدًا max_block_size صفًا. وقد يكون الحجم الفعلي أصغر، ويجب عدم اعتباره ثابتًا.
عند استخدام إحدى طرائق Client query_*_stream، تُعاد النتائج كتلةً بكتلة. ولا يحمّل ClickHouse Connect سوى كتلة واحدة في كل مرة. ويتيح ذلك معالجة كميات كبيرة من البيانات دون الحاجة إلى تحميل مجموعة نتائج كبيرة كاملةً إلى الذاكرة. لاحظ أنه ينبغي أن يكون التطبيق مستعدًا لمعالجة أي عدد من الكتل، ولا يمكن التحكم في الحجم الدقيق لكل كتلة.
مخزن بيانات HTTP المؤقت عند بطء المعالجة
http_buffer_size عندما تتوفر للتطبيق ذاكرة كافية لتخزين المزيد من بيانات الاستجابة مؤقتًا. القيمة الافتراضية هي 10 MiB. تظل بايتات الاستجابة lz4 وzstd مضغوطة داخل هذا المخزن المؤقت، مما يزيد من سعته الفعلية.
StreamContexts
query_*_stream (مثل query_row_block_stream) كائن StreamContext من ClickHouse، وهو كائن مدمج يجمع بين السياق والمولِّد في بايثون. وهذا هو الاستخدام الأساسي:
StreamContext من دون تعليمة with ستؤدي إلى حدوث خطأ. ويضمن استخدام سياق بايثون إغلاق التدفق (في هذه الحالة، استجابة HTTP متدفقة) بشكل صحيح حتى إذا لم تُستهلك جميع البيانات و/أو حدث استثناء أثناء المعالجة. كذلك، لا يمكن استخدام StreamContext لاستهلاك التدفق إلا مرة واحدة. وستؤدي محاولة استخدام StreamContext بعد الخروج منه إلى ظهور StreamClosedError.
إذا فشل الاتصال أثناء قراءة نتيجة، فسيُطلق StreamFailureError بدلًا من إعادة نتيجة مقتطعة بصمت. وتتبع رسالته إعداد show_clickhouse_errors الخاص بالعميل.
يمكنك استخدام الخاصية source في StreamContext للوصول إلى الكائن الأب للنتيجة، الذي يتضمن أسماء الأعمدة وأنواعها. وبالنسبة إلى معظم التدفقات، يكون هذا الكائن QueryResult؛ أما الطريقتان query_np_stream وquery_df_stream فتُظهران بدلًا من ذلك NumpyResult.
أنواع التدفق
query_column_block_stream الكتلة كتسلسل من بيانات الأعمدة المخزَّنة على هيئة أنواع بيانات بايثون الأصلية. وباستخدام استعلامات taxi_trips أعلاه، ستكون البيانات المعادة قائمةً يكون كل عنصر فيها قائمةً أخرى (أو tuple) تضم كل البيانات الخاصة بالعمود المقابل. لذا فإن block[0] سيكون tuple لا يحتوي إلا على سلاسل نصية. وتُستخدم التنسيقات المعتمدة على الأعمدة غالبًا لإجراء عمليات تجميعية على جميع القيم في عمود معيّن، مثل جمع إجمالي الأجور.
تعيد الطريقة query_row_block_stream الكتلة كتسلسل من الصفوف، كما في قواعد البيانات العلائقية التقليدية. وبالنسبة إلى رحلات التاكسي، ستكون البيانات المعادة قائمةً يكون كل عنصر فيها قائمةً أخرى تمثل صفًا من البيانات. لذا فإن block[0] سيحتوي على جميع الحقول بالترتيب لأول رحلة تاكسي، وblock[1] سيحتوي على صف يضم جميع الحقول الخاصة برحلة التاكسي الثانية، وهكذا. وتُستخدم النتائج المعتمدة على الصفوف عادةً لأغراض العرض أو عمليات التحويل.
تنتقل الطريقة query_rows_stream تلقائيًا إلى الكتلة التالية وتُنتج صفًا واحدًا في كل مرة. وهي النظير صفًا بصفّ للطريقة query_row_block_stream.
تعيد الطريقة query_np_stream كل كتلة على شكل مصفوفة NumPy. وعندما تشترك جميع أعمدة النتائج في نوع بيانات NumPy نفسه (dtype)، تكون المصفوفة ثنائية الأبعاد بالشكل (rows, columns). أما النتائج المختلطة فتُعاد على هيئة مصفوفة مهيكلة أحادية البعد أو باستخدام نوع البيانات object.
تعيد الطريقة query_df_stream كل كتلة ClickHouse على شكل Pandas DataFrame ثنائية الأبعاد. إليك مثالًا يوضّح أنه يمكن استخدام الكائن StreamContext كسياق بصورة مؤجلة (ولكن مرة واحدة فقط).
query_df_arrow_stream دفعات Arrow إلى DataFrame من Pandas أو Polars. حدِّد المكتبة باستخدام dataframe_library، وقيمتها الافتراضية "pandas".
أخيرًا، تُغلِّف query_arrow_stream استجابة ClickHouse ArrowStream داخل StreamContext. ويُرجِع كل تكرار RecordBatch من PyArrow.
أمثلة على البيانات المتدفقة
تدفّق الصفوف
تدفق كتل الصفوف
تدفق Pandas DataFrames
تدفق دفعات Arrow
صفوف التدفق غير المتزامنة
استعلامات NumPy وPandas وArrow
استعلامات NumPy
query_np نتائج الاستعلام على شكل مصفوفة NumPy بدلًا من كائن QueryResult في ClickHouse Connect.
استعلامات Pandas
query_df نتائج الاستعلام في صورة Pandas DataFrame بدلًا من QueryResult في ClickHouse Connect.
استعلامات PyArrow
query_arrow جدول PyArrow باستخدام تنسيق الإخراج Arrow في ClickHouse مباشرةً. وهي تقبل query وparameters وsettings وexternal_data وtransport_settings. ويتحكم الخيار use_strings في ما إذا كانت أعمدة ClickHouse من النوع String ستُخرَج كسلاسل نصية في Arrow أو كقيم ثنائية.
DataFrames المستندة إلى Arrow
query_df_arrow وquery_df_arrow_stream. تتجنب هاتان الطريقتان التحويل عبر كائنات الصفوف في بايثون، وتعيدان استخدام مخازن Arrow المؤقتة عندما تسمح بذلك المكتبة المستهدفة:
query_df_arrow: ينفّذ الاستعلام باستخدام تنسيق الإخراجArrowفي ClickHouse ويُرجع DataFrame.dataframe_library="pandas"يُرجع DataFrame من Pandas 2.0 أو إصدار أحدث باستخدامpd.ArrowDtype.dataframe_library="polars"يُرجع DataFrame من Polars مُنشأً عبرpl.from_arrow.
query_df_arrow_stream: يبث دفعات Arrow على شكل DataFrames من Pandas أو Polars.
من الاستعلام إلى DataFrame مستند إلى Arrow
ملاحظات ومحاذير
- يتحكم ClickHouse في مخطط Arrow. ويمكن إرجاع الأنواع التي لا تملك تمثيلًا مباشرًا في Arrow باستخدام نوع فعلي متوافق، بما في ذلك الحقول الثنائية. افحص
table.schemaأو أنواع بيانات DataFrame قبل تطبيق التحويلات الخاصة بالتطبيق. - تتطلب نتائج Pandas المستندة إلى Arrow الإصدار 2.0 من Pandas أو أحدث.
- يتحكم
use_stringsفي ما إذا كانت أعمدة ClickHouseStringتستخدم حقول Arrow النصية أم الثنائية عندما يدعم الخادمoutput_format_arrow_string_as_string. - لا تزال
tz_mode="schema"غير مدعومة في طرق الاستعلام المستندة إلى Arrow. وهي تصدر تحذيرًا وتحافظ على البيانات الوصفية للمنطقة الزمنية التي يوفّرها رد Arrow.
تنسيقات القراءة
query وquery_np وquery_df. ولا تنطبق على الأساليب الخام أو أساليب Arrow، لأن هذه الأساليب تستخدم تنسيق إخراج الخادم مباشرةً. على سبيل المثال، يؤدي تعيين تنسيق قراءة معرّف UUID إلى "string" إلى إرجاع سلاسل UUID بدلًا من كائنات uuid.UUID.
يمكن أن تتضمن وسيطة “نوع البيانات” لأي دالة تنسيق أحرف بدل. ويكون التنسيق سلسلة واحدة بأحرف صغيرة. وتحافظ المغلّفات الحاوية مثل Array وNullable وLowCardinality على التنسيق المحدد لنوع العنصر فيها.
يمكن تعيين تنسيقات القراءة على عدة مستويات:
- على المستوى العام، باستخدام الأساليب المعرّفة في الحزمة
clickhouse_connect.datatypes.format. وسيتحكم ذلك في تنسيق نوع البيانات المُعَدّ لجميع الاستعلامات.
- على مستوى الاستعلام بأكمله، باستخدام وسيطة القاموس الاختيارية
query_formats. في هذه الحالة، سيستخدم أي عمود (أو عمود فرعي) من أنواع البيانات المحددة التنسيق المُهيّأ.
- لعمود نتيجة معيّن، استخدم القاموس الاختياري
column_formats. يمثّل كل مفتاح اسم عمود مُعاد، وتمثّل قيمته سلسلة تنسيق أو تعيينًا متداخلًا من أسماء أنواع ClickHouse إلى التنسيقات، وهذا مفيد مع Tuples وMaps وغيرها من أنواع الحاويات.
خيارات تنسيق القراءة (أنواع بايثون)
البيانات الخارجية
clickhouse_connect.driver.external.ExternalData عبر المعلمة external_data.
يوضح هذا المثال ربط ملف CSV خارجي بجدول
directors مخزَّن على الخادم:
ExternalData الأساسي باستخدام الطريقة add_file، التي تأخذ المعاملات نفسها التي يأخذها المُنشئ. بالنسبة إلى HTTP، تُرسَل جميع البيانات الخارجية كجزء من تحميل ملف multi-part/form-data.
لا تدعم الواجهة الخلفية لـ chDB البيانات الخارجية.
المناطق الزمنية
DateTime وDateTime64 في ClickHouse على هيئة قيم رقمية مستندة إلى epoch. ويحوّلها ClickHouse Connect إلى كائنات datetime في بايثون باستخدام البيانات الوصفية للأعمدة، وتجاوزات الاستعلام، وسياسة المنطقة الزمنية الخاصة بالعميل.
لدى العميل خياران مستقلان للمنطقة الزمنية:
- يحدّد
tz_sourceالمنطقة الزمنية الاحتياطية للأعمدة التي لا تحتوي على بيانات وصفية صريحة للمنطقة الزمنية:"auto"هو الخيار الافتراضي. ويستخدم المنطقة الزمنية للخادم عندما يتمكن العميل من تحديدها بأمان عبر انتقالات التوقيت الصيفي، وإلا يستخدم المنطقة الزمنية المحلية.- تستخدم
"server"دائماً المنطقة الزمنية للخادم. - تستخدم
"local"دائماً المنطقة الزمنية المحلية للعملية.
- يحدّد
tz_modeكيفية التعامل مع معلومات المنطقة الزمنية:"naive_utc"هو الخيار الافتراضي. وتُعاد النتائج ذات التوقيت UTC أو المكافئ له على هيئة كائناتdatetimeغير مرتبطة بمنطقة زمنية، حفاظاً على التوافق مع الإصدارات السابقة.- تحافظ
"aware"علىtzinfoالخاصة بـ UTC وتعيد قيماً مرتبطة بمنطقة زمنية بتوقيت UTC. - تعيد
"schema"قيماً مرتبطة بمنطقة زمنية فقط عندما يصرّح نوع العمود بمنطقة زمنية، وتعيد قيماً غير مرتبطة بمنطقة زمنية لأعمدةDateTime/DateTime64المجرّدة.
"naive_utc" و"aware"، تُحدَّد المنطقة الزمنية النشطة بهذا الترتيب:
- تجاوز
column_tzsلكل عمود. - البيانات الوصفية للمنطقة الزمنية في نوع عمود ClickHouse.
- تجاوز
query_tzعلى مستوى الاستعلام. - معلومات المنطقة الزمنية المُعادة مع استجابة HTTP.
- المنطقة الزمنية الاحتياطية التي يحددها
tz_source.
tz_mode="schema" المناطق الزمنية الخاصة بالاستعلام والمناطق الزمنية الاحتياطية، لكن تجاوز column_tzs الصريح يظل ذا أولوية.
zoneinfo من المكتبة القياسية. تتلقى عمليات تثبيت Windows حزمة tzdata تلقائيًا. في صور Linux المصغّرة التي لا تتضمن قاعدة بيانات IANA للمناطق الزمنية، ثبّت clickhouse-connect[tzdata].
تحافظ نتائج Pandas على الدقة الطبيعية لكل نوع في ClickHouse، مثل datetime64[s] لـ DateTime وdatetime64[ms] لـ DateTime64(3). لا تدعم طريقتا DataFrame المعتمدتان على Arrow، query_df_arrow وquery_df_arrow_stream، الخيار tz_mode="schema" بعد، وستصدران تحذيرًا عند طلبه. وتُرجع query_arrow وquery_arrow_stream البيانات الوصفية للمنطقة الزمنية من استجابة Arrow كما هي.