الانتقال إلى المحتوى الرئيسي
يمكن العثور على أمثلة الشيفرة الكاملة للواجهة القياسية هنا. لتهيئة الاتصال، راجع التهيئة. وللاطلاع على أنواع البيانات المدعومة ومواءمات أنواع Go، راجع أنواع البيانات. تتيح لك واجهة برمجة تطبيقات database/sql، أو الواجهة “القياسية”، استخدام العميل في الحالات التي ينبغي فيها أن تكون شيفرة التطبيق مستقلة عن قواعد البيانات الأساسية من خلال الالتزام بواجهة معيارية. لكن ذلك يأتي بكلفة معيّنة، تتمثل في طبقات إضافية من التجريد وعدم المباشرة، إضافةً إلى أنواع أولية لا تتوافق بالضرورة مع ClickHouse. ومع ذلك، تكون هذه الكلفة مقبولة عادةً عندما تحتاج الأدوات إلى الاتصال بعدة قواعد بيانات. إضافةً إلى ذلك، يدعم هذا العميل استخدام HTTP كطبقة نقل، مع بقاء البيانات مرمّزة بالتنسيق الأصلي لتحقيق أفضل أداء.

الاتصال

يمكن إنشاء الاتصال إما عبر سلسلة DSN بالتنسيق clickhouse://<host>:<port>?<query_option>=<value> باستخدام الطريقة Open، أو عبر الطريقة clickhouse.OpenDB. ولا تُعدّ الطريقة الأخيرة جزءًا من مواصفة database/sql، لكنها تُرجع مثيلًا من sql.DB. وتوفّر هذه الطريقة وظائف مثل التنميط، والتي لا توجد طريقة واضحة لإتاحتها عبر مواصفة database/sql.
مثال كامل في جميع الأمثلة التالية، ما لم يُذكر خلاف ذلك صراحةً، نفترض أن متغير ClickHouse ‏conn قد أُنشئ وهو متاح.

إعدادات الاتصال

تتشارك معظم خيارات التهيئة مع واجهة برمجة تطبيقات ClickHouse. راجع التهيئة للاطلاع على الإعدادات المشتركة. تتوفر معلمات DSN التالية الخاصة بـ SQL:
  • hosts - قائمة مفصولة بفواصل لعناوين مضيفين مفردة لأغراض موازنة الحمل والتبديل التلقائي عند الفشل - راجع الاتصال بعُقد متعددة.
  • username/password - بيانات اعتماد المصادقة - راجع المصادقة
  • database - تحديد قاعدة البيانات الافتراضية الحالية
  • dial_timeout - سلسلة مدة، وهي تسلسل قد يكون موقّعًا من أعداد عشرية، لكل منها جزء كسري اختياري ولاحقة وحدة مثل 300ms و1s. وحدات الوقت الصالحة هي ms وs وm.
  • connection_open_strategy - random/in_order (القيمة الافتراضية random) - راجع الاتصال بعُقد متعددة
    • round_robin - اختيار خادم من المجموعة بأسلوب round-robin
    • in_order - يتم اختيار أول خادم متاح وفقًا للترتيب المحدد
  • debug - تمكين مخرجات Debug (قيمة منطقية)
  • compress - تحديد خوارزمية الضغط - none (الافتراضي)، zstd، lz4، gzip، deflate، br. إذا تم تعيينه إلى true، فسيُستخدم lz4. لا يدعم الاتصال native سوى lz4 وzstd.
  • compress_level - مستوى الضغط (الافتراضي هو 0). راجع Compression. وهذا خاص بالخوارزمية:
    • gzip - من -2 (أفضل سرعة) إلى 9 (أفضل ضغط)
    • deflate - من -2 (أفضل سرعة) إلى 9 (أفضل ضغط)
    • br - من 0 (أفضل سرعة) إلى 11 (أفضل ضغط)
    • zstd، lz4 - يتم تجاهله
  • secure - إنشاء اتصال SSL آمن (الافتراضي هو false)
  • skip_verify - تخطي التحقق من الشهادة (الافتراضي هو false)
  • block_buffer_size - يتيح لك التحكم في حجم مخزن block المؤقت. راجع BlockBufferSize. (الافتراضي هو 2)
المثال الكامل

الاتصال عبر HTTP

بشكل افتراضي، يتم إنشاء الاتصالات عبر البروتوكول الأصلي. وللمستخدمين الذين يحتاجون إلى HTTP، يمكن تمكين ذلك إما بتعديل DSN ليشمل بروتوكول HTTP أو بتحديد Protocol في خيارات الاتصال.
مثال كامل

الجلسات

HTTP فقطلا تكون الجلسات مطلوبة إلا عند استخدام النقل عبر HTTP. أما اتصالات TCP الأصلية فتتضمن جلسة مدمجة تلقائيًا.
عند استخدام HTTP، مرِّر session_id كإعداد لتفعيل الإمكانات المرتبطة بالجلسة، مثل الجداول المؤقتة.
مثال كامل

التنفيذ

بمجرد الحصول على اتصال، يمكنك تنفيذ عبارات sql عبر الطريقة Exec.
مثال كامل لا تدعم هذه الطريقة تمرير كائن سياق إليها، وتُنفَّذ افتراضيًا باستخدام سياق الخلفية. يمكنك استخدام ExecContext إذا احتجت إلى ذلك — راجع استخدام سياق.

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

يمكن تحقيق آلية الدفعات بإنشاء sql.Tx عبر الطريقة Being. ومن خلاله، يمكن الحصول على دفعة باستخدام الطريقة Prepare مع تعليمة INSERT. ويُرجع ذلك كائن sql.Stmt يمكن إلحاق الصفوف به باستخدام الطريقة Exec. وستتراكم الدفعة في الذاكرة إلى أن تُنفَّذ Commit على sql.Tx الأصلي.
المثال الكامل

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

يمكن إجراء استعلام عن صف واحد باستخدام الدالة QueryRow. ويُرجع ذلك قيمة من النوع *sql.Row، يمكن بعدها استدعاء Scan عليها مع مؤشرات إلى متغيرات تُنسخ إليها قيم الأعمدة. ويتيح المتغير QueryRowContext تمرير كائن سياق غير background - راجع استخدام سياق.
مثال كامل يتطلب التكرار على عدة صفوف استخدام الدالة Query. وتُرجع هذه الدالة بنية *sql.Rows يمكن استدعاء Next عليها للتنقل بين الصفوف. ويتيح النظير QueryContext تمرير سياق.
مثال متكامل

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

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

ربط المعلمات

تدعم واجهة برمجة تطبيقات القياسية إمكانات ربط المعلمات نفسها المتوفرة في واجهة برمجة تطبيقات ClickHouse، ما يتيح تمرير المعلمات إلى الطرق Exec وQuery وQueryRow (وصيغها المكافئة التي تستخدم سياق). كما تدعم المعلمات الموضعية والمسمّاة والمرقّمة.
المثال الكامل يرجى ملاحظة أن الحالات الخاصة لا تزال سارية.

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

تدعم واجهة برمجة تطبيقات القياسية الإمكانية نفسها لتمرير المهل الزمنية وإشارات الإلغاء وغيرها من القيم المرتبطة بنطاق الطلب عبر السياق، كما هو الحال في واجهة برمجة تطبيقات ClickHouse. وعلى عكس واجهة برمجة تطبيقات ClickHouse، يتحقق ذلك باستخدام صيغ Context من الطرق؛ أي إن الطرق مثل Exec، التي تستخدم سياق الخلفية افتراضيًا، لها صيغة مقابلة هي ExecContext يمكن تمرير سياق إليها بوصفه المعامل الأول. ويتيح ذلك تمرير السياق في أي مرحلة من مراحل تدفق التطبيق. فعلى سبيل المثال، يمكنك تمرير سياق عند إنشاء اتصال عبر ConnContext أو عند طلب صف استعلام عبر QueryRowContext. وتظهر أدناه أمثلة على جميع الطرق المتاحة. لمزيد من التفاصيل حول استخدام السياق لتمرير المهل الزمنية وإشارات الإلغاء ومعرّفات الاستعلام ومفاتيح الحصص وإعدادات الاتصال، راجع Using Context الخاصة بـ واجهة برمجة تطبيقات ClickHouse.
مثال كامل

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

على غرار واجهة برمجة تطبيقات ClickHouse، تتوفر معلومات عن نوع العمود، مما يتيح لك إنشاء مثيلات وقت التشغيل لمتغيرات ذات أنواع صحيحة وتمريرها إلى Scan. يتيح ذلك قراءة الأعمدة عندما لا يكون نوعها معروفًا.
مثال كامل

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

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

OpenTelemetry

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

الضغط

تدعم واجهة برمجة تطبيقات القياسية خوارزميات الضغط نفسها التي تدعمها واجهة برمجة تطبيقات ClickHouse، أي الضغط باستخدام lz4 وzstd على مستوى الكتلة. بالإضافة إلى ذلك، يُدعَم الضغط باستخدام gzip وdeflate وbr لاتصالات HTTP. إذا كان أيٌّ من هذه الخيارات مفعّلًا، فسيُطبَّق الضغط على الكتل أثناء الإدراج وعلى استجابات الاستعلامات. أما الطلبات الأخرى، مثل رسائل ping أو طلبات الاستعلام، فستظل غير مضغوطة. وهذا متسق مع خياري lz4 وzstd. إذا كنت تستخدم الطريقة OpenDB لإنشاء اتصال، فيمكن تمرير إعدادات Compression. ويشمل ذلك إمكانية تحديد مستوى الضغط (انظر أدناه). وإذا كنت تتصل عبر sql.Open باستخدام DSN، فاستخدم المعلَمة compress. ويمكن أن تكون هذه إما خوارزمية ضغط محددة، مثل gzip أو deflate أو br أو zstd أو lz4، أو قيمة منطقية. وإذا ضُبطت القيمة على true، فسيُستخدم lz4. والقيمة الافتراضية هي none، أي إن الضغط معطّل.
مثال متكامل
مثال كامل يمكن التحكم في مستوى الضغط المطبَّق عبر معلَمة DSN ‏compress&#95;level أو حقل Level في خيار Compression. القيمة الافتراضية هي 0، لكنها تختلف حسب الخوارزمية:
  • gzip - من -2 (أفضل سرعة) إلى 9 (أفضل ضغط)
  • deflate - من -2 (أفضل سرعة) إلى 9 (أفضل ضغط)
  • br - من 0 (أفضل سرعة) إلى 11 (أفضل ضغط)
  • zstd, lz4 - يتم تجاهلهما
آخر تعديل في ٢ يوليو ٢٠٢٦