الانتقال إلى المحتوى الرئيسي
تتوفر جميع أمثلة الشيفرة الخاصة بـ ClickHouse API هنا. لإعداد الاتصال، راجع التهيئة. للاطلاع على أنواع البيانات المدعومة وتعيينات الأنواع في Go، راجع أنواع البيانات.

الاتصال

يوضح المثال التالي، الذي يعرض إصدار الخادم، كيفية الاتصال بـ ClickHouse، على افتراض أن ClickHouse غير مؤمَّن ويمكن الوصول إليه باستخدام المستخدم default. لاحظ أننا نستخدم منفذ native الافتراضي للاتصال.
مثال كامل في جميع الأمثلة التالية، ما لم يُذكر خلاف ذلك صراحةً، نفترض أن المتغير conn الخاص بـ ClickHouse قد تم إنشاؤه وهو متاح.

التنفيذ

يمكن تنفيذ عبارات مختلفة عبر الطريقة Exec. وهذا مفيد لعبارات DDL والعبارات البسيطة. ولا ينبغي استخدامها لعمليات الإدراج الكبيرة أو للتكرار على نتائج الاستعلامات.
مثال كامل لاحظ أنه يمكن تمرير Context إلى الاستعلام. ويمكن استخدام ذلك لتمرير إعدادات محددة على مستوى الاستعلام — راجع استخدام Context.

الإدراج على دفعات

لإدراج عدد كبير من الصفوف، يوفّر العميل آلية العمل على دفعات. ويتطلب ذلك تجهيز دفعة يمكن إلحاق الصفوف بها، ثم إرسالها في النهاية باستخدام الأسلوب Send(). وتبقى الدفعات في الذاكرة إلى أن يُنفَّذ Send. يُوصى باستدعاء Close على الدفعة لتجنّب تسرّب الاتصالات. ويمكن القيام بذلك باستخدام الكلمة المحجوزة defer بعد تجهيز الدفعة. وسيؤدي ذلك إلى تنظيف الاتصال إذا لم يُستدعَ Send مطلقًا. لاحظ أن هذا سيؤدي إلى ظهور 0 من عمليات إدراج الصفوف في سجل الاستعلامات إذا لم يتم إلحاق أي صفوف.
مثال كامل تنطبق توصيات ClickHouse هنا. لا ينبغي مشاركة الدُفعات بين go-routines — أنشئ دفعة منفصلة لكل روتين. استنادًا إلى المثال أعلاه، لاحظ ضرورة توافق أنواع المتغيرات مع نوع العمود عند إضافة الصفوف. ومع أن المطابقة تكون واضحة عادةً، فإن هذه الواجهة تحاول أن تكون مرنة، وستُحوَّل الأنواع ما لم يترتب على ذلك فقدان في الدقة. على سبيل المثال، يوضح ما يلي إدراج قيمة نصية في datetime64.
مثال كامل للاطّلاع على ملخص كامل لأنواع Go المدعومة لكل نوع من الأعمدة، راجع تحويلات الأنواع.

الأعمدة المؤقتة

الأعمدة المؤقتة هي أعمدة للكتابة فقط، ولا توجد إلا أثناء الإدراج — فهي لا تُخزَّن ولا يمكن الاستعلام عنها. وهي مفيدة لحساب قيم الأعمدة المشتقة وقت الإدراج.
مثال كامل

الاستعلام عن الصفوف

يمكنك إما الاستعلام عن صف واحد باستخدام الدالة QueryRow، أو الحصول على مؤشر للتكرار عبر مجموعة النتائج باستخدام Query. وبينما تتيح الأولى تمرير وجهة تُسلسَل البيانات إليها، تتطلب الثانية استدعاء Scan لكل صف.
المثال الكامل
مثال كامل لاحظ أنه في كلتا الحالتين، يجب تمرير مؤشر إلى المتغيرات التي نريد إسناد قيم الأعمدة المقابلة إليها. ويجب تمرير هذه المؤشرات بالترتيب المحدد في عبارة SELECT — وبشكل افتراضي، سيُستخدم ترتيب تعريف الأعمدة عند استخدام SELECT * كما هو موضح أعلاه. وعلى غرار الإدراج، تتطلب طريقة Scan أن تكون المتغيرات الهدف من نوع مناسب. والهدف هنا أيضًا هو توفير المرونة، مع تحويل الأنواع حيثما أمكن، ما دام ذلك لا يؤدي إلى فقدان في الدقة. على سبيل المثال، يوضح المثال أعلاه قراءة عمود UUID إلى متغير string. للحصول على قائمة كاملة بأنواع Go المدعومة لكل نوع عمود، راجع تحويلات الأنواع. أخيرًا، لاحظ إمكانية تمرير Context إلى الطريقتين Query وQueryRow. ويمكن استخدام ذلك لإعدادات على مستوى الاستعلام — راجع استخدام Context لمزيد من التفاصيل.

الإدراج غير المتزامن

تدعم عمليات الإدراج غير المتزامنة عبر الطريقة Async. ويتيح ذلك للمستخدم تحديد ما إذا كان ينبغي للعميل انتظار الخادم حتى يُكمل عملية الإدراج، أو أن يستجيب بمجرد استلام البيانات. وهذا يتحكم فعليًا في المعلَمة wait_for_async_insert.
المثال الكامل

الإدراج بصيغة الأعمدة

يمكن تنفيذ عمليات الإدراج بصيغة الأعمدة. وقد يوفّر ذلك مزايا في الأداء إذا كانت البيانات منظَّمة مسبقًا بهذه البنية، لأنه يجنّب الحاجة إلى تحويلها إلى صفوف.
مثال كامل

استخدام structs

توفّر structs في Golang للمستخدمين تمثيلًا منطقيًا لصف من البيانات في ClickHouse. ولتسهيل ذلك، توفّر الواجهة الأصلية عدة دوال ملائمة.

Select مع serialize

تتيح الطريقة Select تحويل مجموعة من صفوف الاستجابة إلى slice من structs عبر استدعاء واحد.
مثال كامل

Scan struct

يتيح ScanStruct تحويل صف واحد من استعلام إلى struct.
مثال كامل

إلحاق struct

يتيح AppendStruct إلحاق struct بـ دفعة موجودة وتفسيرها على أنها صف كامل. ويتطلب ذلك أن تتطابق أعمدة struct مع الجدول من حيث الاسم والنوع. وبينما يجب أن يكون لكل الأعمدة حقل مكافئ في struct، قد لا يكون لبعض حقول struct عمود مكافئ. وسيتم تجاهل هذه الحقول ببساطة.
مثال كامل

ربط المعلمات

يدعم العميل ربط المعلمات في الطرق Exec وQuery وQueryRow. وكما هو موضح في المثال أدناه، يُدعَم ذلك باستخدام المعلمات المُسمّاة والمرقّمة والموضعية. ونورد أمثلة على ذلك أدناه.
المثال الكامل

حالات خاصة

بشكل افتراضي، ستُفكّك المقاطع إلى قائمة قيم مفصولة بفواصل إذا مُرِّرت كمُعامل إلى query. وإذا كنت بحاجة إلى إدراج مجموعة من القيم محاطةً بـ [ ]، فيجب استخدام ArraySet. إذا كانت المجموعات/tuples مطلوبة، ومحاطةً بـ ( )، على سبيل المثال لاستخدامها مع عوامل التشغيل IN، فيمكنك استخدام GroupSet. ويكون ذلك مفيدًا بشكل خاص عندما تكون هناك حاجة إلى مجموعات متعددة، كما هو موضح في المثال أدناه. أخيرًا، تتطلب حقول DateTime64 تحديد precision لضمان عرض المُعاملات بالشكل المناسب. لكن مستوى precision لهذا الحقل غير معروف لدى العميل، لذا يجب على المستخدم توفيره. ولتسهيل ذلك، نوفّر المُعامل DateNamed.
المثال الكامل

استخدام السياق

توفّر سياقات Go وسيلةً لتمرير المهل الزمنية، وإشارات الإلغاء، وغيرها من القيم المرتبطة بنطاق الطلب عبر حدود واجهة برمجة تطبيقات. تقبل جميع الطرائق على الاتصال سياقًا بوصفه المعامل الأول. وبينما استخدمت الأمثلة السابقة context.Background()، يمكنك استخدام هذه الإمكانية لتمرير الإعدادات والمهل الزمنية وإلغاء الاستعلامات. يتيح تمرير سياق أُنشئ باستخدام withDeadline فرض حدود على وقت تنفيذ الاستعلامات. لاحظ أن هذا وقتٌ مطلق، وأن انتهاء المهلة لن يؤدي إلا إلى تحرير الاتصال وإرسال إشارة إلغاء إلى ClickHouse. ويمكن استخدام WithCancel بدلًا من ذلك لإلغاء استعلام صراحةً. تتيح الأداتان المساعدتان clickhouse.WithQueryID و clickhouse.WithQuotaKey تحديد معرّف استعلام ومفتاح حصة. ويمكن أن تكون معرّفات الاستعلامات مفيدة لتتبّع الاستعلامات في السجلات ولأغراض الإلغاء. كما يمكن استخدام مفتاح الحصة لفرض حدود على استخدام ClickHouse استنادًا إلى قيمة مفتاح فريدة — راجع إدارة الحصص لمزيد من التفاصيل. يمكنك أيضًا استخدام السياق لضمان تطبيق إعداد معيّن على استعلام محدد فقط، بدلًا من تطبيقه على الاتصال بالكامل، كما هو موضح في إعدادات الاتصال. أخيرًا، يمكنك التحكم في حجم المخزن المؤقت للكتل عبر clickhouse.WithBlockSize. يتجاوز هذا الإعدادَ على مستوى الاتصال BlockBufferSize، ويتحكم في الحد الأقصى لعدد الكتل التي تُفك شيفرتها ويُحتفظ بها في الذاكرة في أي وقت. وقد تعني القيم الأكبر قدرًا أكبر من التوازي على حساب الذاكرة. تظهر أمثلة على ما سبق أدناه.
المثال الكامل

معلومات Progress وProfile وLog

يمكن طلب معلومات Progress وProfile وLog مع الاستعلامات. تعرض معلومات Progress إحصاءات عن عدد الصفوف والبايتات التي تمت قراءتها ومعالجتها في ClickHouse. في المقابل، توفّر معلومات Profile ملخصًا للبيانات المُعادة إلى العميل، بما في ذلك إجماليات البايتات (غير المضغوطة) والصفوف والكتل. وأخيرًا، توفّر معلومات Log إحصاءات عن سلاسل التنفيذ، مثل استخدام الذاكرة وسرعة البيانات. يتطلب الحصول على هذه المعلومات من المستخدم استخدام Context، حيث يمكنه تمرير دوال استدعاء إليه.
المثال الكامل

المسح الديناميكي

قد تحتاج إلى قراءة جداول لا تعرف مخططها أو أنواع الحقول التي تُرجعها. ويشيع هذا في الحالات التي يُجرى فيها تحليل بيانات مخصّص أو تُطوَّر فيها أدوات عامة. ولتحقيق ذلك، تتوفر معلومات أنواع الأعمدة ضمن استجابات الاستعلام. ويمكن استخدام ذلك مع reflection في Go لإنشاء مثيلات وقت التشغيل لمتغيرات ذات أنواع صحيحة، بحيث يمكن تمريرها إلى Scan.
المثال الكامل

الجداول الخارجية

تسمح الجداول الخارجية للعميل بإرسال بيانات إلى ClickHouse مع استعلام SELECT. وتُوضَع هذه البيانات في جدول مؤقت، ويمكن استخدامها داخل الاستعلام نفسه أثناء تنفيذ الاستعلام. لإرسال بيانات خارجية مع استعلام عبر العميل، يجب على المستخدم إنشاء جدول خارجي باستخدام ext.NewTable قبل تمريره عبر السياق.
مثال كامل

OpenTelemetry

يدعم ClickHouse تمرير سياق التتبّع عبر بروتوكولي النقل TCP وHTTP. عند استخدام TCP، يقوم العميل بتسلسل span ضمن البروتوكول الثنائي الأصلي. استخدم clickhouse.WithSpan لإرفاق span باستعلام عبر الـ context.
قيد في نقل HTTPرغم أن ClickHouse server يقبل ترويسات HTTP القياسية traceparent / tracestate، فإن ناقل HTTP في clickhouse-go لا يرسلها حاليًا، لذا لا يكون لـ WithSpan أي تأثير عبر HTTP. وكحل بديل، يمكنك ضبط الترويسة يدويًا عبر HttpHeaders في خيارات الاتصال.
مثال كامل يمكن العثور على التفاصيل الكاملة حول الاستفادة من إمكانات التتبّع ضمن دعم OpenTelemetry.
آخر تعديل في ٢٥ يونيو ٢٠٢٦