Skip to main content

إدراج البيانات باستخدام ClickHouse Connect: الاستخدام المتقدم

سياقات الإدراج

ينفّذ ClickHouse Connect عمليات الإدراج بتنسيق Native، والطريقتين insert وinsert_df، ضمن InsertContext. أما الطرائق insert_arrow وinsert_df_arrow وraw_insert فترسل الحمولات مباشرة ولا تستخدمه. يتضمّن InsertContext جميع القيم المُرسلة كوسيطات إلى الطريقة insert الخاصة بالعميل. بالإضافة إلى ذلك، عند إنشاء InsertContext لأول مرة، يسترجع ClickHouse Connect أنواع البيانات لأعمدة الإدراج المطلوبة لتنفيذ عمليات الإدراج بكفاءة باستخدام تنسيق Native. ومن خلال إعادة استخدام InsertContext في عمليات إدراج متعددة، يمكن تجنّب هذا “الاستعلام التمهيدي”، وتُنَفَّذ عمليات الإدراج بسرعة وكفاءة أكبر. يمكن الحصول على InsertContext باستخدام الطريقة create_insert_context الخاصة بالعميل. تأخذ هذه الطريقة الوسيطات نفسها التي تأخذها الدالة insert، باستثناء context نفسه. لاحظ أنه يجب تعديل الخاصية data فقط في InsertContext عند إعادة الاستخدام. وهذا يتوافق مع الغرض المقصود منه، وهو توفير كائن قابل لإعادة الاستخدام لعمليات الإدراج المتكررة لبيانات جديدة في الجدول نفسه.
تتضمن InsertContexts حالة قابلة للتغيير تُحدَّث أثناء عملية الإدراج، لذا فهي غير آمنة للاستخدام من عدة خيوط.

تنسيقات الكتابة

تُطبَّق تنسيقات الكتابة على عدد محدود من الأنواع. وفي معظم الحالات، يحدِّد ClickHouse Connect تلقائيًا تنسيق الكتابة الصحيح للعمود بالاستناد إلى أول قيمة بيانات غير NULL فيه. على سبيل المثال، عندما تكون أول قيمة في عمود DateTime عددًا صحيحًا، يتعامل العميل معها على أنها ثانية الحقبة. وعادةً لا تكون هناك حاجة إلى تجاوز تنسيق الكتابة، لكن يمكن للطرق الموجودة في clickhouse_connect.datatypes.format تعيين تنسيق على مستوى عام. كما تحافظ أغلفة الحاويات مثل Array وNullable وLowCardinality على سلوك تنسيق نوع العنصر.

خيارات تنسيقات الكتابة

طرق insert المتخصصة

يوفّر ClickHouse Connect طرق insert متخصصة لتنسيقات البيانات الشائعة:
  • insert_df — إدراج Pandas DataFrame كبيانات Native موجّهة حسب الأعمدة. كما تدعم أسماء/أنواع الأعمدة الصريحة أو InsertContext قابلًا لإعادة الاستخدام.
  • insert_arrow — إدراج PyArrow Table باستخدام تنسيق الإدخال Arrow في ClickHouse.
  • insert_df_arrow — إدراج Pandas DataFrame مدعوم بـ Arrow أو Polars DataFrame. يجب أن تستخدم جميع أعمدة Pandas أنواع بيانات مدعومة بـ Arrow.
تقبل الطرق الثلاث جميعًا database وsettings وtransport_settings الخاصة بنقل HTTP لكل طلب.
تُعد مصفوفة NumPy من نوع Sequence of Sequences صالحة، ويمكن استخدامها باعتبارها الوسيط data في طريقة insert الرئيسية، لذلك لا حاجة إلى طريقة متخصصة.

إدراج DataFrame من Pandas

إدراج جدول PyArrow

إدراج DataFrame مدعوم بـ Arrow ‏(pandas 2.x)

إنشاء جدول من مخطط PyArrow

تُنشئ create_table_from_arrow_schema تعليمة CREATE TABLE من حقول Arrow القياسية أحادية القيمة. ويغطي هذا الربط الأعداد الصحيحة الموقعة وغير الموقعة، والقيم ذات الفاصلة العائمة، والقيم المنطقية، والسلاسل النصية، والتواريخ، والطوابع الزمنية. كما أنها تُنشئ عمدًا أعمدة ClickHouse غير قابلة لـ NULL وتُطلق TypeError لأنواع Arrow غير المدعومة، لذا راجع عبارة DDL المُولَّدة قبل تنفيذها.

المناطق الزمنية

عند إدراج كائنات datetime من بايثون في أعمدة DateTime أو DateTime64، يحوّلها ClickHouse Connect إلى قيم محسوبة منذ الحقبة.

كائنات datetime المزوّدة بمعلومات المنطقة الزمنية

تحافظ الكائنات المزوّدة بمعلومات المنطقة الزمنية على اللحظة الزمنية التي تمثلها. ولا يلزم أن تتطابق المنطقة الزمنية للمصدر مع المنطقة الزمنية المحددة في عمود ClickHouse.
تستخدم ClickHouse Connect وحدة zoneinfo من المكتبة القياسية. ولم يعد المشغّل يعتمد على pytz.

كائنات datetime غير المزوّدة بمنطقة زمنية

يتحكم الإعداد العام naive_datetime_insert في عمليات الإدراج الأصلية لكائنات datetime غير المزوّدة بمنطقة زمنية في بايثون. وينطبق أيضًا على سلاسل ISO غير المزوّدة بمنطقة زمنية التي تقبلها أعمدة DateTime64.
  • تكون "local" القيمة الافتراضية في الإصدار 1.x. تفسّر بايثون القيمة وفق المنطقة الزمنية للعملية عند استدعاء .timestamp(). ويحافظ ذلك على السلوك الحالي.
  • تفسّر "server" القيمة باعتبارها وقت الساعة الفعلي ضمن المنطقة الزمنية المعلنة للعمود DateTime أو DateTime64. وإذا لم تكن للعمود منطقة زمنية، فتستخدم المنطقة الزمنية للخادم التي أُبلغ عنها عند اتصال العميل.
اضبط الخيار قبل إجراء عملية إدراج. تُقرأ قيمته عند إجراء تسلسل لكل عمود إدراج أصلي يحتوي على كائنات datetime من بايثون أو سلاسل ISO لـ DateTime64، لذا ينطبق التغيير على العملاء الحاليين وسياقات الإدراج القابلة لإعادة الاستخدام.
مع "server"، يربط ClickHouse Connect قيمة tzinfo المستهدفة قبل تحويل القيمة إلى حقبة زمنية. بالنسبة إلى المناطق الزمنية التابعة لـ IANA، يتبع قواعد المكتبة القياسية لانتقالات التوقيت الصيفي. في التداخل الخريفي، تُستخدم قيمة fold الخاصة بـ datetime. تحدد القيمة الافتراضية fold=0 الإزاحة قبل الانتقال، بينما تحدد fold=1 الإزاحة بعده. أما الفجوة الربيعية فتستخدم اختيار الإزاحة نفسه، ولا تُرفض أو تُطبَّع. قد لا تحتفظ أوقات الساعة غير الموجودة ضمن الفجوة الربيعية بالقيمة نفسها بعد المرور بمعامل استعلام وضع الساعة، لأن محلل النصوص في ClickHouse قد يختار إزاحة مختلفة. استخدم datetime مدركًا للمنطقة الزمنية أو وقت ساعة صالحًا عندما تكون اللحظة الدقيقة مهمة. لا ينطبق هذا الخيار إلا على إدراج كائنات بايثون الأصلية لقيم datetime وسلاسل ISO غير المدركة للمنطقة الزمنية التي يقبلها DateTime64. تحتفظ أعمدة NumPy وPandas غير المدركة للمنطقة الزمنية من نوع datetime64 بتحويلها الحالي لوقت الساعة بتوقيت UTC. لتمثيل لحظة محددة بصورة مستقلة عن أي من الوضعين، أرفق المنطقة الزمنية المطلوبة أو وفّر عددًا صحيحًا للحقبة الزمنية صراحةً.
تستخدم معاملات الاستعلام datetime غير المرتبطة بمنطقة زمنية إعداد naive_datetime_binding المنفصل. يرسل الوضع الافتراضي "wall" حقول الوقت كما هي دون تحويل وفق المنطقة الزمنية المحلية للمضيف. راجع قسم وسيطة Parameters.

أعمدة DateTime ذات البيانات الوصفية للمنطقة الزمنية

يمكن لأعمدة ClickHouse تحديد بيانات وصفية للمنطقة الزمنية، على سبيل المثال DateTime('America/Denver') أو DateTime64(3, 'Asia/Tokyo'). وتتحكم هذه البيانات الوصفية في كيفية عرض القيم عند الاستعلام عنها. عند إدراج قيمة مدركة للمنطقة الزمنية، يحافظ ClickHouse Connect على اللحظة الزمنية التي تمثلها. أما القيمة غير المدركة للمنطقة الزمنية، فيتحكم إعداد naive_datetime_insert في تحديد ما إذا كانت المنطقة الزمنية للعملية أو المنطقة الزمنية للعمود هي المستخدمة. وعند الاستعلام، تستخدم النتيجة المنطقة الزمنية للعمود ما لم يتم توفير تجاوز لكل عمود باستخدام وسيطة column_tzs. ولا تتجاوز وسيطة query_tz المنطقة الزمنية المعلنة للعمود.

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

يقوم clickhouse_connect.driver.tools.insert_file بتمرير ملف محلي إلى جدول موجود، ويوكل عملية التحليل إلى ClickHouse. يمكن تمرير إعدادات تنسيق الإدخال، مثل input_format_allow_errors_ratio وinput_format_allow_errors_num، عبر settings.
مع AsyncClient، استخدم await مع insert_file_async بالوسائط نفسها:
يقرأ المساعد غير المتزامن الملف في خيط تنفيذ عامل قبل انتظار اكتمال raw_insert، لذا تبقى محتويات الملف مخزنة في الذاكرة.
آخر تعديل في ١٤ أغسطس ٢٠٢٦