الاتصال
يوضح المثال التالي، الذي يعرض إصدار الخادم، كيفية الاتصال بـ ClickHouse، على افتراض أن ClickHouse غير مؤمَّن ويمكن الوصول إليه باستخدام المستخدم default. لاحظ أننا نستخدم منفذ native الافتراضي للاتصال.conn الخاص بـ ClickHouse قد تم إنشاؤه وهو متاح.
التنفيذ
يمكن تنفيذ عبارات مختلفة عبر الطريقةExec. وهذا مفيد لعبارات DDL والعبارات البسيطة. ولا ينبغي استخدامها لعمليات الإدراج الكبيرة أو للتكرار على نتائج الاستعلامات.
Context إلى الاستعلام. ويمكن استخدام ذلك لتمرير إعدادات محددة على مستوى الاستعلام — راجع استخدام Context.
الإدراج على دفعات
لإدراج عدد كبير من الصفوف، يوفّر العميل آلية العمل على دفعات. ويتطلب ذلك تجهيز دفعة يمكن إلحاق الصفوف بها، ثم إرسالها في النهاية باستخدام الأسلوبSend(). وتبقى الدفعات في الذاكرة إلى أن يُنفَّذ Send.
يُوصى باستدعاء Close على الدفعة لتجنّب تسرّب الاتصالات. ويمكن القيام بذلك باستخدام الكلمة المحجوزة defer بعد تجهيز الدفعة. وسيؤدي ذلك إلى تنظيف الاتصال إذا لم يُستدعَ Send مطلقًا. لاحظ أن هذا سيؤدي إلى ظهور 0 من عمليات إدراج الصفوف في سجل الاستعلامات إذا لم يتم إلحاق أي صفوف.
الأعمدة المؤقتة
الأعمدة المؤقتة هي أعمدة للكتابة فقط، ولا توجد إلا أثناء الإدراج — فهي لا تُخزَّن ولا يمكن الاستعلام عنها. وهي مفيدة لحساب قيم الأعمدة المشتقة وقت الإدراج.الاستعلام عن الصفوف
يمكنك إما الاستعلام عن صف واحد باستخدام الدالة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 عمود مكافئ. وسيتم تجاهل هذه الحقول ببساطة.
معلمات الاستعلام من جانب الخادم
تستخدم معلمات الاستعلام من جانب خادم ClickHouse عناصر نائبة محددة النوع بالصيغة{name:Type}. يُرسَل الاستعلام وقيم المعلمات كلٌّ على حدة، ولذلك لا تُدمَج قيم المعلمات في نص SQL.
في ClickHouse API، مرِّر المعلمات عبر سياق الاستعلام:
clickhouse.Named:
clickhouse.Named أيضًا مع صيغة الربط @name من جهة العميل، إذ إن العنصر النائب المستخدم في الاستعلام ({name:Type} أو @name) هو الذي يحدد الآلية المعتمدة.
قيم String وتسلسلات الهروب
تعتمد طريقة تفسير قيمة string على الطريقة التي تُمرِّرها بها. تتعاملclickhouse.Named (أو sql.Named) مع قيمة من النوع string/*string أو []byte/*[]byte باعتبار قيمة Go هي القيمة الحرفية للمعلمة. يتولى المشغّل إفلات محارف التحكم تلقائيًا، لذا تُكتب القيمة وتُقرأ مجددًا مطابقةً للأصل بايتًا ببايت على كلا البروتوكولين. ولا مانع من أن تحتوي القيمة على محرف سطر جديد أو محرف جدولة فعلي:
clickhouse.Parameters / WithParameters دائمًا على نص معلمة مُسلسَل مسبقًا بصيغة Escaped الخاصة بـ ClickHouse، ولا يُطبَّق عليه الإفلات تلقائيًا. يفك ClickHouse تسلسلات الهروب المبدوءة بالشرطة المائلة العكسية أثناء تحليل المعلمة: \n (سطر جديد)، و\t (محرف الجدولة)، و\r (محرف الإرجاع)، و\0 (بايت فارغ)، و\\ (شرطة مائلة عكسية حرفية). أما \N فهو وسم NULL الذي يمثّل القيمة بأكملها في الأنواع القابلة للقيم الفارغة.
تعالج Go القيم الحرفية من نوع string المُفسَّرة ("...") قبل أن تصل إلى clickhouse-go، بينما تُبقي القيم الحرفية من نوع string الخام (`...`) على الشرطات المائلة العكسية كما هي. لذا، عند استخدام Parameters، اكتب نص المعلمة على النحو التالي:
لا تستخدم
"line 1\nline 2" أو "column 1\tcolumn 2" عند إنشاء Parameters، إذ تحتوي هاتان القيمتان الحرفيتان في Go أصلًا على سطر جديد أو محرف جدولة فعلي. وفي صيغة Escaped الخاصة بـ ClickHouse، تُستخدم بايتات السطر الجديد ومحرف الجدولة الفعلية فواصلَ بين الحقول، فيرفض الخادم المعلمة لأن تحليلها لم يكتمل. استخدم Named بدلًا من ذلك إذا أردت أن تُعامَل string في Go على أنها قيمة حرفية.
قيم المعلمات ليست قيمًا حرفية في SQL: فعند تمرير String في المستوى الأعلى عبر Named، مرِّر القيمة دون علامات اقتباس SQL؛ أي استخدم hello وليس 'hello'، لأن علامات الاقتباس هذه ستصبح جزءًا من القيمة. أما الأنواع المركبة فتظل تستخدم صيغتها النصية، مثل ['a', 'b'] لنوع Array(String)، ويمكنك تمريرها كذلك عبر Named ما دام النص خاليًا من تسلسلات الهروب بالشرطة المائلة العكسية ومن محارف التحكم الخام. وإذا احتاج النص المركب إلى تسلسلات الهروب \' لقيم من نوع string متداخلة، فمرِّره عبر Parameters بدلًا من ذلك.
مثال كامل على واجهة برمجة التطبيقات الأصلية
ربط المعلمات
يدعم العميل ربط المعلمات في الطرق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 في خيارات الاتصال.