Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

postgresql

يسمح بتنفيذ استعلامات SELECT وINSERT على البيانات المخزنة على خادم PostgreSQL بعيد.

الصياغة

postgresql({host:port, database, table, user, password[, schema, [, on_conflict]] | named_collection[, option=value [,..]]} [, SETTINGS name=value, ...])

الوسيطات

الوسيطة الوصف
host:port عنوان خادم PostgreSQL.
database اسم قاعدة البيانات البعيدة.
table اسم الجدول البعيد، أو استعلام يُمرَّر إلى PostgreSQL كما هو (انظر تمرير استعلام بدلًا من اسم جدول).
user مستخدم PostgreSQL.
password كلمة مرور المستخدم.
schema مخطط جدول غير default. اختياري.
on_conflict استراتيجية معالجة التعارض. مثال: ON CONFLICT DO NOTHING. اختياري.

يمكن أيضًا تمرير الوسيطات باستخدام المجموعات المسماة. في هذه الحالة، يجب تحديد host وport كلٌّ منهما على حدة. ويُنصح بهذا النهج في بيئة الإنتاج.

تُمرَّر معلمات TLS/SSL إلى libpq، ويمكن توفيرها كمفاتيح ضمن مجموعة مسماة أو كوسيطات مفتاح-قيمة لاحقة: sslmode (disable أو allow أو prefer أو require أو verify-ca أو verify-full؛ وعند عدم تعيينها، يُطبَّق الإعداد الافتراضي prefer الخاص بـlibpq)، إضافةً إلى الشهادات والمفتاح بإحدى صيغتين. تشير sslrootcert (شهادة CA، أو القيمة الخاصة system) وsslcert (شهادة العميل) وsslkey (المفتاح الخاص للعميل) إلى مسارات ملفات محلية على الخادم، ولا يمكن تحديدها إلا في مجموعة مسماة معرَّفة في ملف تهيئة الخادم. أما sslrootcert_pem وsslcert_pem وsslkey_pem فتقبل المحتوى الحرفي للملف المقابل بدلًا من ذلك — على سبيل المثال، postgresql('host:port', 'database', 'table', 'user', 'password', sslmode = 'verify-full', sslrootcert_pem = '...') — وتُخفى في السجلات واستعلامات SHOW كما تُخفى كلمة المرور.

القيمة المعادة

كائن جدول يحتوي على الأعمدة نفسها الموجودة في جدول PostgreSQL الأصلي.

الإعدادات

يمكن تهيئة تجمّع الاتصالات المستخدم في دالة الجدول postgresql (وفي محرك الجدول PostgreSQL) باستخدام عبارة SETTINGS في نهاية العبارة. وإذا لم يُحدَّد إعداد معيّن، فستُستخدم تلقائيًا قيمة إعداد postgresql_* المناظر له على مستوى الاستعلام. راجع قسم الإعدادات الخاص بمحرك الجدول للاطلاع على القائمة الكاملة لإعدادات postgresql_connection_pool_* وpostgresql_connection_attempt_timeout وقيمها الافتراضية.

مثال:

SELECT * FROM postgresql('localhost:5432', 'test', 'test', 'postgresql_user', 'password', SETTINGS postgresql_connection_pool_size = 32);

تفاصيل التنفيذ

تُنفَّذ استعلامات SELECT على جانب PostgreSQL بصيغة COPY (SELECT ...) TO STDOUT داخل معاملة PostgreSQL للقراءة فقط، مع إجراء commit بعد كل استعلام SELECT.

تُنفَّذ عبارات WHERE البسيطة مثل =, !=, >, >=, <, <= وIN على خادم PostgreSQL.

تُنفَّذ جميع عمليات الربط والتجميع والفرز وشروط IN [ array ] وقيد sampling الخاص بـ LIMIT في ClickHouse فقط بعد اكتمال الاستعلام على PostgreSQL.

تمرير استعلام بدلاً من اسم جدول

بدلاً من اسم جدول، يمكن أن تكون الوسيطة الثالثة استعلام SELECT يُمرَّر إلى PostgreSQL كما هو. ويُستدل على بنية الجدول الناتج من نتيجة الاستعلام. ويمكن كتابة الاستعلام إما على شكل استعلام فرعي، أو بتغليفه داخل الدالة query:

SELECT * FROM postgresql('localhost:5432', 'test', (SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0), 'user', 'password');
SELECT * FROM postgresql('localhost:5432', 'test', query('SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0'), 'user', 'password');

يفيد هذا في دفع عمليات الربط والتجميع أو أي معالجة أخرى إلى PostgreSQL. ويكون هذا الجدول للقراءة فقط: لا يُسمح بتنفيذ INSERT فيه. وتدعم البنية نفسها في محرك الجدول PostgreSQL.

تُنفَّذ استعلامات INSERT على جانب PostgreSQL بصيغة COPY "table_name" (field1, field2, ... fieldN) FROM STDIN داخل معاملة PostgreSQL، مع auto-commit بعد كل تعليمة INSERT.

تُحوَّل أنواع Array في PostgreSQL إلى مصفوفات في ClickHouse.

يدعم عدة نُسخ متماثلة يجب إدراجها باستخدام |. على سبيل المثال:

SELECT name FROM postgresql(`postgres{1|2|3}:5432`, 'postgres_database', 'postgres_table', 'user', 'password');

أو

SELECT name FROM postgresql(`postgres1:5431|postgres2:5432`, 'postgres_database', 'postgres_table', 'user', 'password');

يدعم تحديد أولوية النسخ المتماثلة لمصدر القاموس في PostgreSQL. وكلما كان الرقم في map أكبر، كانت الأولوية أقل. وأعلى أولوية هي 0.

أمثلة

جدول في PostgreSQL:

postgres=# CREATE TABLE "public"."test" (
"int_id" SERIAL,
"int_nullable" INT NULL DEFAULT NULL,
"float" FLOAT NOT NULL,
"str" VARCHAR(100) NOT NULL DEFAULT '',
"float_nullable" FLOAT NULL DEFAULT NULL,
PRIMARY KEY (int_id));

CREATE TABLE

postgres=# INSERT INTO test (int_id, str, "float") VALUES (1,'test',2);
INSERT 0 1

postgresql> SELECT * FROM test;
  int_id | int_nullable | float | str  | float_nullable
 --------+--------------+-------+------+----------------
       1 |              |     2 | test |
(1 row)

اختيار البيانات من ClickHouse باستخدام الوسيطات المباشرة:

SELECT * FROM postgresql('localhost:5432', 'test', 'test', 'postgresql_user', 'password') WHERE str IN ('test');

أو باستخدام المجموعات المُسمّاة:

CREATE NAMED COLLECTION mypg AS
        host = 'localhost',
        port = 5432,
        database = 'test',
        user = 'postgresql_user',
        password = 'password';
SELECT * FROM postgresql(mypg, table='test') WHERE str IN ('test');
┌─int_id─┬─int_nullable─┬─float─┬─str──┬─float_nullable─┐
│      1 │         ᴺᵁᴸᴸ │     2 │ test │           ᴺᵁᴸᴸ │
└────────┴──────────────┴───────┴──────┴────────────────┘

الإدراج:

INSERT INTO TABLE FUNCTION postgresql('localhost:5432', 'test', 'test', 'postgrsql_user', 'password') (int_id, float) VALUES (2, 3);
SELECT * FROM postgresql('localhost:5432', 'test', 'test', 'postgresql_user', 'password');
┌─int_id─┬─int_nullable─┬─float─┬─str──┬─float_nullable─┐
│      1 │         ᴺᵁᴸᴸ │     2 │ test │           ᴺᵁᴸᴸ │
│      2 │         ᴺᵁᴸᴸ │     3 │      │           ᴺᵁᴸᴸ │
└────────┴──────────────┴───────┴──────┴────────────────┘

استخدام مخطط غير افتراضي:

postgres=# CREATE SCHEMA "nice.schema";

postgres=# CREATE TABLE "nice.schema"."nice.table" (a integer);

postgres=# INSERT INTO "nice.schema"."nice.table" SELECT i FROM generate_series(0, 99) as t(i)
CREATE TABLE pg_table_schema_with_dots (a UInt32)
        ENGINE PostgreSQL('localhost:5432', 'clickhouse', 'nice.table', 'postgrsql_user', 'password', 'nice.schema');

نسخ بيانات Postgres أو ترحيلها باستخدام PeerDB

إلى جانب دوال الجداول، يمكنك دائمًا استخدام PeerDB من ClickHouse لإعداد مسار بيانات مستمر من Postgres إلى ClickHouse. تُعد PeerDB أداةً مصممةً خصيصًا لنسخ البيانات من Postgres إلى ClickHouse باستخدام التقاط بيانات التغيير (CDC).

Navigation