Skip to main content

ملخص

الوصف

تربط الوحدة chdb_hook نفسها بأمر COPY في PostgreSQL لاستخدام chDB في نسخ البيانات TO أو FROM أي من تنسيقات البيانات المدعومة التي يوفرها chDB في ملفات محلية، أو buckets AWS S3، أو Google Cloud Storage، وغيرها. كما تربط نفسها بأمر CREATE TABLE، بحيث يمكن لأي table أن يشتق أعمدة الخاصة به وأن يُحمّل rows الخاصة به من أي من تلك الأهداف نفسها.

التحميل

حمّل chdb_hook بإحدى الطرق التالية بصفتك مستخدماً فائق الصلاحيات، واختر الطريقة الأنسب لحالة الاستخدام لديك:
  • بشكل صريح عبر أمر LOAD؛ ويظل سارياً طوال مدة الجلسة:
    لا يدعم SQL Console في ClickHouse Cloud حتى الآن الأمر LOAD 'chdb_hook'، لكن يمكن تنفيذه عبر psql أو أي اتصال قاعدة بيانات آخر. وبخلاف ذلك، تواصل مع ممثل الدعم لديك لإضافته إلى إعدادات خدمة Postgres الخاصة بك، ليصبح بعدها قابلاً للاستخدام في SQL Console.
  • لجميع الجلسات، عبر الإعداد [session_preload_libraries] في ملف postgresql.conf:
    أو عبر ALTER SYSTEM:
    ويمكن أيضاً ضبط هذا الإعداد لكل قاعدة بيانات على حدة عبر ALTER DATABASE:
    أو لمستخدمين ومجموعات محددة عبر ALTER ROLE:
  • عند بدء تشغيل الخادم عبر الإعداد [shared_preload_libraries]، بحيث يكون متاحاً دائماً لجميع الجلسات وقواعد البيانات:
انتبه إلى أن تحميل chdb_hook يتيح للمستخدمين المنتمين إلى دوري pg_read_server_files أو pg_write_server_files تنفيذ COPY لنقل البيانات من وإلى ملفات على خادم Postgres، وكذلك من وإلى التخزين السحابي.

التحميل الزائد لأمر COPY

عند التحميل، يرتبط chdb_hook بأمر COPY في Postgres لنسخ البيانات TO أو FROM أي من تنسيقات البيانات المدعومة التي يوفرها chDB في الملفات المحلية، وحاويات AWS S3، وGoogle Cloud Storage، وغيرها. فلتحميل جدول من ملف CSV في S3، على سبيل المثال، أنشئ الجدول ثم استدعِ COPY مع عنوان URL بالصيغة s3://:

الصلاحيات

يتطلب COPY الخاص بـ chdb_hook نفس صلاحيات COPY الذي يحلّ مكانه: صلاحية SELECT على العلاقة أو على كل عمود يُنسخ في حالة COPY TO، وصلاحية INSERT في حالة COPY FROM. أما عنوان URL من النوع file:// فهو يقرأ ملفاً على الخادم أو يكتب إليه، ولذلك يتطلب أيضاً العضوية في pg_read_server_files أو pg_write_server_files. ويتطلب COPY FROM معاملة قراءة وكتابة.

مخططات URL

لا يُنفَّذ chdb_hook إلا لأهداف COPY من نوع URL التي تستخدم أحد المخططات التالية:

تنسيقات URL

يختلف تنسيق عناوين URL حسب الهدف.

File

يجب أن يكون مساراً مطلقاً على خادم Postgres، أما المسار النسبي فيؤدي إلى خطأ. يجب أن يكون مستخدم Postgres عضواً في الدور pg_read_server_files أو pg_write_server_files، حسب الحالة. كما يجب أن يمتلك مستخدم نظام Postgres صلاحية القراءة أو الكتابة على الملف، حسب الحالة. وبالنسبة إلى COPY TO، إذا كان المسار غير موجود، فسيُنشئ chdb_hook أي أدلة أب مفقودة؛ ويجب أن يمتلك صلاحية نظام الملفات اللازمة للقيام بذلك. مثال:

HTTP

أي عنوان URL عادي عبر HTTP، بما في ذلك عناوين التخزين السحابي العام. في حالة COPY TO، سيحاول chdb_hook إرسال البيانات إلى العنوان باستخدام POST. مثال:

S3

قد تأتي عناوين URL الخاصة بـ S3 على شكل عنوان URI لـ S3
أو عنوان URL لكائن:

GCS

تأتي عناوين URL الخاصة بـ GCS على هيئة URL عام:
أو عنوان URI لـ Cloud Storage، الذي يحوّله chdb_hook إلى عنوان URL عام:

Azure Blob Storage

استخدم عنوان URL بالصيغة blob.windows.net مع اسم الحساب كنطاق فرعي:
أو استخدم اسم مضيف آخر:

Azure ABFS

يجب أن تتّبع عناوين URL الخاصة بـ ABFS التنسيق التالي:

عناوين HDFS URL

يمكن أن تأخذ عناوين HDFS شكل عناوين URL المعتادة بنمط HTTP مع منفذ اختياري:

أنماط المسار (Path Wildcards)

قد تحتوي مسارات URL على globs في أوامر COPY FROM. ويجب أن تطابق الملفات نمط المسار بالكامل، لا الـ suffix أو الـ prefix فقط. والاستثناء الوحيد هو: عندما يشير المسار إلى directory موجود دون استخدام globs، تُضاف * ضمنيًا إلى المسار لتحديد جميع الملفات الموجودة في الـ directory. الـ wildcards المدعومة:
  • *: تطابق أي عدد من المحارف عدا /، بما في ذلك السلسلة الفارغة.
  • ?: تطابق محرفًا واحدًا أيًا كان.
  • {groucho,harpo,chico}: تستبدل أي من السلاسل “groucho” و”harpo” و “chico”. وقد تحتوي هذه السلاسل على /.
  • {N..M}: تطابق أي رقم >= N و<= M.
  • **: تطابق تعاوديًا جميع الملفات في الـ directory.
على سبيل المثال، لتحميل البيانات من هذه الملفات بأمر واحد: استخدم {some,another}_prefix لمطابقة اسمَي الـ directory و some_file_{1..3}.csv' لمطابقة الملفات، على هذا النحو:

الخيارات

يدعم أمر COPY في chdb_hook الخيارات التالية:

format:

التنسيق المستخدم للقراءة أو الكتابة. يجب أن يكون أحد formats التي يوفرها chDB، ومنها TSV وCSV وParquet وIceberg وJSON وغيرها. أهمل هذا الخيار أو اضبطه على auto ليحدد chDB التنسيق من امتداد اسم الملف في نهاية عنوان URL.

structure

بنية بيانات chDB الخاصة بالصف. تتكوّن من قائمة بأسماء الأعمدة و[أنواع بيانات ClickHouse] والمُعدِّلات. إذا أُغفلت، فإن chdb_hook يربط أنواع بيانات Postgres بأنواع ClickHouse المناسبة عمومًا؛ راجع Postgres إلى chDB للتفاصيل. وإذا ضُبطت على auto، فسيحاول chDB استنتاج الأنواع. مثال:

access_key و access_secret

بيانات الاعتماد طويلة الأمد لمستخدم AWS account لمصادقة الـ requests.

session_token

رمز جلسة AWS الذي يُستخدم مع access_key وaccess_secret، ويُحدَّد غالبًا عبر متغير البيئة AWS_SESSION_TOKEN. يُستخدم فقط مع عناوين URL الخاصة بـ S3.

compression

صيغة ضغط الملف. استخدم هذا الخيار إذا لم يكن من الممكن استنتاج نوع الضغط من اسم الملف. القيم المدعومة:
  • auto (الافتراضي)
  • none
  • gzip أو gz
  • brotli أو br
  • xz أو LZMA
  • zstd أو zst
  • lz4
  • bz2
  • snappy

timeout

مهلة الطلب بالميلي ثانية. تنطبق على عناوين URL لكل من HTTP وS3 وGCS وAzure. القيمة الافتراضية 30000 (30 ثانية).

Debugging

عند حدوث خطأ، يُضمّن أمر COPY الخاص بـ chdb_hook استعلام chDB الذي حاول تنفيذه في سياق الخطأ:
يستخدم chdb_hook عناصر نائبة بنمط {name:Type} لمعاملات الاستعلام للحماية من ثغرات حقن SQL وللتقليل من مخاطر تسجيل البيانات الحساسة مثل بيانات الاعتماد. أما إذا احتجت إلى الاطلاع على محتوى تلك المعاملات لتشخيص مشكلة ما، فاضبط مؤقتًا معامل Postgres العام [log_min_messages] على DEBUG1 أو أعلى، ليرسل chdb_hook الاستعلام والمعاملات إلى سجل Postgres (وليس إلى العميل مطلقًا)، حيث ستظهر على النحو التالي:
لا تترك [log_min_messages] مضبوطًا على مستوى تنقيح لمدة تتجاوز جلسة تنقيح واحدة، تجنّبًا لتسجيل معلومات حسّاسة مثل بيانات الاعتماد، ولأنّ PostgreSQL نفسه يسجّل كذلك معلومات التنقيح وقد يملأ السجل بسرعة.

التحميل الزائد لـ CREATE TABLE

يستخدم chdb_hook خطافًا أيضًا مع CREATE TABLE، بحيث يمكن للجدول أن يشتق أعمدته وأن يحمّل صفوفه من عنوان URL. لإنشاء جدول ببنية مشتقة من عنوان URL، مرّر عنوان URL في الخيار structure_from واترك قائمة الأعمدة فارغة:
استخدم copy_from لتحميل الصفوف بالإضافة إلى الأعمدة:
يستنتج copy_from الأعمدة فقط عندما لا يُحدّد الـ statement أيًّا منها بنفسه. فقائمة الأعمدة، أو الـ clause INHERITS، أو النوع OF، أو الـ partition، كلٌّ منها يُعرّف أعمدةً، وعندها لا ينسخ copy_from سوى ما يلي:
يدعم كلا الخيارين نفس URL schemes وoptions التي يدعمها COPY؛ فجميعها ينطبق هنا: بيانات الاعتماد وformat وcompression وtimeout وحتى تحديد structure بشكل صريح. أما Postgres فيحتفظ بما تبقّى من storage parameters:
لا يعمل أي من structure_from أو copy_from مع IF NOT EXISTS. استخدم COPY لتحميل علاقة موجودة.

القيود

نظراً لبعض المشكلات المعروفة والاختلافات في سلوك أنواع البيانات بين Postgres و chDB، فإن chdb_hook تنطبق عليه القيود التالية:
  • لا يمكن تنفيذ COPY على العلاقات التي تنطبق عليها سياسات row-level security الخاصة بالدور الذي يقوم بالنسخ. إذ يطبّق Postgres هذه السياسات عن طريق إعادة كتابة COPY TO في صورة استعلام، وهو ما لا يدعمه chdb_hook.
  • لا يوجد في ClickHouse مصفوفة NULL، لذا يخزّن COPY TO مصفوفة فارغة ([]) بدلاً من قيمة NULL.
  • يمثّل ClickHouse ما يعادل lseg أو path أو polygon على هيئة مصفوفات؛ وبالتالي فإن قيم NULL من هذه الأنواع يَنسخها COPY TO أيضاً كمصفوفة فارغة ([]).
  • قيم NULL المُخرَجة وفق structure محددة لا تُعرِّف العمود على أنه Nullable ستُخرَج بقيمها الافتراضية. لذا عرّف دائماً الأعمدة القابلة لقيم NULL بشكل صريح في structure لتجنّب هذا التحويل.
  • المسار path المفتوح الذي تتساوى نقطته الأخيرة مع نقطته الأولى يُخرَج كمسار مغلق.
  • لا يوجد في Protobuf قيمة null داخل حقل متكرر، لذا فإنه يحذف قيم NULL من المصفوفات.
  • يدعم JSON type في chDB كائنات JSON فقط؛ فلا تستبدل التعيين الافتراضي String لـ json وjsonb بـ JSON إلا إذا كانت جميع القيم كائنات JSON. (ClickHouse/ClickHouse#68428)
  • يتجاهل JSON type في chDB قيم null؛ فمفاتيح الكائن التي قيمتها NULL ستُحذف عند الإخراج. لا تستبدل التعيين الافتراضي String لـ json و jsonb بـ JSON إلا إذا لم تكن قيم الكائن null أو كان فقدانها مقبولاً. (ClickHouse/ClickHouse#68428)
  • تتحقق تنسيقات JSON وJSONCompact وJSONColumnsWithMetadata دائماً من صحة UTF-8، لذا تُخرِج قيم bytea مع محارف استبدال.
  • يقرأ COPY FROM حقل Protobuf من نوع Nullable يحتوي على سلسلة فارغة أو صفراً كأنه NULL. (chdb-io/chdb-core#152)
  • يُسقِط COPY TO إلى Parquet قيم NULL من null map الخاص بـ Nullable Tuple. (ClickHouse/ClickHouse#112427)
  • لا يوجد في تنسيقات Parquet وArrow وArrowStream وORC وAvro وProtobuf وProtobufList وMsgPack وBSONEachRow أي نوع يقابل time في Postgres أو Time64 في chDB. لذا هيّئ أعمدة time كـ String في structure صريحة للحفاظ على قيمها.
  • يقتطع إخراج Protobuf قيم timestamp إلى مستوى الثانية.
  • لا يدعم إخراج Protobuf التواريخ السابقة لـ 1970-01-01. هيّئ أعمدة time كـ String في structure صريحة للحفاظ على قيمها. (ClickHouse/ClickHouse#111860)
  • لا يستطيع تنسيقا CSVWithNames وCSVWithNamesAndTypes حالياً استيراد قيم NULL من نوع box أو circle. (ClickHouse/ClickHouse#115523)

أنواع البيانات

يعمل COPY على تعيين أنواع Postgres الخاصة بـ علاقة إلى أنواع chDB، بينما يعيّن CREATE TABLE أنواع chDB الخاصة بـ URL إلى أنواع Postgres.

Postgres إلى chDB

في حال عدم تحديد خيار structure صريح، يعيّن chdb_hook أنواع Postgres إلى مكافئات معقولة في chDB. وإذا لم تكن ملائمة لحالة الاستخدام الخاصة بك، فحدّد structure لتجاوز الأنواع المُولَّدة بالأنواع التي تحتاجها. تُعيَّن أنواع المصفوفات إلى Array من نوع العنصر المقابل. تفرض ClickHouse قابلية القيم الفارغة على مستوى العمود، بينما يفرضها Postgres على مستوى المصفوفة، لذا تكون العناصر دائمًا Nullable. لا يُعيَّن أي نوع في Postgres إلى Map أو Tuple، لكن يمكن تحديد أحدهما عبر structure. يمكن تحويل Map إلى مصفوفة من أزواج المفتاح والقيمة، ويُحوَّل Tuple إلى مصفوفة. استخدم text[] لدعم الأنواع غير المتجانسة.

تحويل الطابع الزمني

في التنسيقات النصية العادية (TSV وCSV وغيرها)، يُخرج الخطاف COPY قيم DateTime وDateTime64 بصيغة ISO-8601، YYYY-MM-DDThh:mm:ssZ، بصرف النظر عن الإعداد datestyle الحالي. ويضمن ذلك بقاء قيم timestamptz متسقة، حتى إذا كان المصدر الذي يستورد القيم يستخدم منطقة زمنية مختلفة. أما استخدام نوع مختلف في مخرجات structure، مثل Datetime64(3, 'America/Los_Angeles')، فلا يؤثر في إزاحة المخرجات، لكنه يغيّر الدقة. أمثلة على Timestamp TZ: كما يحوّل الخطاف COPY قيم الطابع الزمني من المنطقة الزمنية للجلسة إلى التوقيت العالمي المنسق (UTC)، مما يضمن إخراجها نسبةً إلى تلك المنطقة الزمنية. وعند تحميلها في نظام جديد، من المفترض أن يحوّلها إلى منطقته الزمنية المحلية. وبالتالي ستختلف القيم إذا اختلفت المنطقة الزمنية، لكنها ستبقى متكافئة بحسب فارق المنطقة الزمنية. مثال على تأثير الإعداد timezone في الطابع الزمني 2026-08-28T12:00:00:

من chDB إلى Postgres

يعيّن chdb_hook أنواع ClickHouse التي يُبلّغ عنها DESCRIBE إلى أنواع Postgres التالية: كل نوع من أنواع chDB غير مذكور في هذا الجدول يثير خطأً، ومنها Nested وVariant وDynamic. استخدم structure يربطها بالنوع String لقراءتها كنص. يدعم Postgres نطاقًا أضيق من chDB في بعض هذه الأنواع؛ ولذلك يثير النسخ خطأً عند وجود Time أو Time64 يتجاوز 24 ساعة، وكذلك عند وجود Date32 خارج نطاق التواريخ الذي يدعمه Postgres.

ترميز النص

يقرأ chDB الأنواع String وFixedString وEnum وJSON كبايتات، دون أي ضمان بشأن الترميز. وعند نسخ عمود من هذا النوع إلى text أو إلى أي نوع آخر غير ثنائي، يتم التحقق من البايتات وفق ترميز قاعدة البيانات، ويُثار خطأ للبيانات التي يتعذّر تمثيلها:
يرفض كل ترميز محارف NUL، التي لا يستطيع Postgres تخزينها في text. انسخ البيانات إلى bytea للحفاظ على البايتات كما كتبها chDB. وسمِّ هذه الأعمدة على هذا النحو، إذ إن CREATE TABLE يستنتج النوع text لهذه الأنواع:
يحشو FixedString(N) القيم الأقصر ببايتات NUL. والنسخ إلى text يُسقِط بايتات NUL اللاحقة، بينما يحتفظ bytea بالبايتات الـ N جميعها.

الإعدادات

chdb_hook.max_memory

يُحدِّد الحد الأقصى لمقدار الذاكرة المتاح لاستعلام chDB، ويُستخدم لضبط إعداد max_memory_usage في chDB. يتطلب صلاحية المستخدم فائق الصلاحيات. استخدم عددًا صحيحًا للتعبير عن عدد الميغابايت أو إحدى وحدات الذاكرة التالية:
  • B (بايت)
  • kB (كيلوبايت)
  • MB (ميغابايت)
  • GB (غيغابايت)
  • TB (تيرابايت)
القيمة الافتراضية هي 0، أي عدم فرض أي حد على الذاكرة.

chdb_hook.max_threads

الحد الأقصى لعدد خيوط معالجة الاستعلام في استعلام chDB، ويُستخدم لتعيين إعداد max_threads في chDB. يتطلب صلاحية المستخدم فائق الصلاحيات. القيمة الافتراضية هي 0، مما يتيح لـ chDB تحديد القيمة بنفسه. نوصي بشدة بتعيين chdb_hook.max_threads قبل تنفيذ عملية COPY كبيرة، لمنع chDB من استنفاد استخدام وحدة المعالجة المركزية بالكامل على حساب PostgreSQL.

chdb_hook.max_parsing_threads

الحد الأقصى لعدد الخيوط (threads) التي يمكن أن يستخدمها chDB لتحليل البيانات في تنسيقات الإدخال التي تدعم التحليل المتوازي، ويُستخدم لتعيين إعداد max_parsing_threads في chDB. يتطلب صلاحيات المستخدم الفائق. القيمة الافتراضية هي 0، مما يترك تحديد القيمة إلى chDB. نوصي بتعيين chdb_hook.max_parsing_threads قبل تنفيذ COPY لكمية كبيرة من البيانات، لمنع chDB من استهلاك كامل طاقة المعالج (CPU) على حساب PostgreSQL.

سياسة الإصدارات

يتبع chdb_hook Semantic Versioning في إصداراته العامة.
  • يزيد رقم الإصدار الرئيسي (major version) عند حدوث تغييرات في واجهة برمجة التطبيقات
  • يزيد رقم الإصدار الفرعي (minor version) عند حدوث تغييرات SQL متوافقة مع الإصدارات السابقة
  • يزيد رقم إصدار التصحيح (patch) عند التغييرات التي تمسّ الملف الثنائي (binary) وحده
بعد التثبيت، يمكن الاستعلام عن الإصدار في PostgreSQL باستخدام دالة pg_get_loaded_modules() المتوفرة في Postgres 18.

المؤلفون

Copyright (c) 2026, ClickHouse
آخر تعديل في ٢٦ سبتمبر ٢٠٢٦