ملخص
الوصف
تربط الوحدة 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]، بحيث يكون متاحاً
دائماً لجميع الجلسات وقواعد البيانات:
التحميل الزائد لأمر 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 لـ S3GCS
تأتي عناوين URL الخاصة بـ GCS على هيئة 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.
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_1.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_2.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/some_prefix/some_file_3.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_1.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_2.csv
- https://clickhouse-public-datasets.s3.amazonaws.com/my-test-bucket-768/another_prefix/some_file_3.csv
{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.
- S3: access key ID and access secret خاص بـ AWS، ويُعرَّفان غالبًا عبر environment variables
AWS_ACCESS_KEY_IDوAWS_SECRET_ACCESS_KEY - GCS: HMAC key and secret خاص بـ GCP
- Azure: اسم Azure Storage account وaccess key
session_token
رمز جلسة AWS الذي يُستخدم مع access_key وaccess_secret، ويُحدَّد غالبًا عبر
متغير البيئة AWS_SESSION_TOKEN. يُستخدم فقط مع عناوين URL الخاصة بـ S3.
compression
صيغة ضغط الملف. استخدم هذا الخيار إذا لم يكن من الممكن استنتاج نوع الضغط من اسم الملف. القيم المدعومة:
auto(الافتراضي)nonegzipأوgzbrotliأوbrxzأوLZMAzstdأوzstlz4bz2snappy
timeout
مهلة الطلب بالميلي ثانية. تنطبق على عناوين URL لكل من HTTP وS3 وGCS وAzure.
القيمة الافتراضية 30000 (30 ثانية).
Debugging
عند حدوث خطأ، يُضمّن أمرCOPY الخاص بـ chdb_hook استعلام chDB الذي حاول تنفيذه في سياق الخطأ:
{name:Type} لمعاملات الاستعلام
للحماية من ثغرات حقن SQL وللتقليل من مخاطر
تسجيل البيانات الحساسة مثل بيانات الاعتماد.
أما إذا احتجت إلى الاطلاع على محتوى تلك المعاملات لتشخيص
مشكلة ما، فاضبط مؤقتًا معامل Postgres العام [log_min_messages] على DEBUG1 أو
أعلى، ليرسل chdb_hook الاستعلام والمعاملات إلى سجل Postgres
(وليس إلى العميل مطلقًا)، حيث ستظهر على النحو التالي:
التحميل الزائد لـ CREATE TABLE
يستخدم chdb_hook خطافًا أيضًا مع CREATE TABLE، بحيث يمكن للجدول أن يشتق أعمدته وأن يحمّل صفوفه من عنوان URL. لإنشاء جدول ببنية مشتقة من عنوان URL، مرّر عنوان URL في الخيارstructure_from واترك قائمة الأعمدة فارغة:
copy_from لتحميل الصفوف بالإضافة إلى الأعمدة:
copy_from الأعمدة فقط عندما لا يُحدّد الـ statement أيًّا منها بنفسه.
فقائمة الأعمدة، أو الـ clause INHERITS، أو النوع OF، أو الـ partition، كلٌّ منها يُعرّف
أعمدةً، وعندها لا ينسخ copy_from سوى ما يلي:
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 أو إلى أي نوع آخر
غير ثنائي، يتم التحقق من البايتات وفق ترميز قاعدة البيانات، ويُثار خطأ
للبيانات التي يتعذّر تمثيلها:
text.
انسخ البيانات إلى bytea للحفاظ على البايتات كما كتبها chDB. وسمِّ هذه الأعمدة على هذا النحو، إذ إن
CREATE TABLE يستنتج النوع text لهذه الأنواع:
FixedString(N) القيم الأقصر ببايتات NUL. والنسخ إلى text يُسقِط
بايتات NUL اللاحقة، بينما يحتفظ bytea بالبايتات الـ N جميعها.
الإعدادات
chdb_hook.max_memory
max_memory_usage في chDB. يتطلب صلاحية المستخدم فائق الصلاحيات. استخدم عددًا صحيحًا
للتعبير عن عدد الميغابايت أو إحدى وحدات الذاكرة التالية:
B(بايت)kB(كيلوبايت)MB(ميغابايت)GB(غيغابايت)TB(تيرابايت)
0، أي عدم فرض أي حد على الذاكرة.
chdb_hook.max_threads
max_threads في chDB. يتطلب صلاحية المستخدم فائق الصلاحيات. القيمة الافتراضية هي
0، مما يتيح لـ chDB تحديد القيمة بنفسه.
نوصي بشدة بتعيين chdb_hook.max_threads قبل تنفيذ عملية COPY كبيرة،
لمنع chDB من استنفاد استخدام وحدة المعالجة المركزية بالكامل على حساب
PostgreSQL.
chdb_hook.max_parsing_threads
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) وحده
pg_get_loaded_modules() المتوفرة في Postgres 18.