You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/en/connectors.md
+43-6Lines changed: 43 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -364,16 +364,19 @@ sink:
364
364
365
365
## PostgreSQL
366
366
367
-
The PostgreSQL connector supports reading from and writing to PostgreSQL tables. It supports custom SQL queries, periodic polling, batch inserts, auto-create tables, and UPSERT mode.
367
+
The PostgreSQL connector supports reading from and writing to PostgreSQL tables. It supports custom SQL queries, periodic polling, batch inserts, auto-create tables, UPSERT mode, CDC-style change tracking (inserts and updates), soft delete, and SecretRef for credentials.
368
368
369
369
### Source
370
370
371
371
```yaml
372
372
source:
373
373
type: postgresql
374
374
postgresql:
375
+
# Connection string (required, or use connectionStringSecretRef)
# Table to read from (required if query not specified). Supports schema.table (e.g. public.products)
376
378
table: source_table
379
+
377
380
# Custom SQL query (optional)
378
381
query: "SELECT * FROM source_table WHERE updated_at > NOW() - INTERVAL '1 hour'"
379
382
# Poll interval in seconds (optional, default: 5)
@@ -382,14 +385,32 @@ source:
382
385
# Raw mode (optional, default: false)
383
386
# When true, wraps each row as JSON: {"value": <row data>, "_metadata": {table, id}}
384
387
rawMode: true
388
+
389
+
# CDC-style options (optional)
390
+
readBatchSize: 1000 # Limit rows per poll to reduce DB load (0 = no limit)
391
+
changeTrackingColumn: updated_at # Column to track changes (default: updated_at). Not used when query is specified
392
+
autoCreateTable: true # Create table if it doesn't exist before reading
393
+
394
+
# SecretRef (optional) - use instead of direct values
395
+
# connectionStringSecretRef:
396
+
# name: postgres-credentials
397
+
# key: connectionString
398
+
# tableSecretRef:
399
+
# name: postgres-credentials
400
+
# key: table
385
401
```
386
402
387
-
### Features
403
+
### Source Features
388
404
389
405
- **Periodic Polling**: Regularly polls the table for new data
390
406
- **Custom Queries**: Support for complex SQL with JOIN, WHERE, etc.
391
-
- **Metadata**: Each message contains `table` metadata
407
+
- **Metadata**: Each message contains `table` metadata and `operation` (insert/update)
392
408
- **Raw Mode**: When enabled, wraps each row as JSON with `value` (row data) and `_metadata` (table, id)
409
+
- **Read Batch Size**: Limits rows per poll to reduce database load when many new records appear
410
+
- **Change Tracking**: By default tracks changes via `updated_at` column (or `changeTrackingColumn`), captures both INSERTs and UPDATEs
411
+
- **Auto-create Table**: Creates the table with CDC-friendly schema (id, created_at, updated_at) if it doesn't exist
412
+
- **Schema notation**: Table name supports `schema.table` format (e.g. `public.products`)
413
+
- **In-memory state**: Read position (lastReadChangeTime) is stored only in memory. On pod/connector restart, the table is fully re-read. For pg→pg flows, enable `upsertMode: true` in sink to update duplicates instead of inserting them again.
- **Batch Inserts**: Groups messages for efficient writing
415
-
- **Auto-create Tables**: Creates tables with JSONB field and GIN index
449
+
- **Batch Inserts**: Groups messages for efficient writing. Flush when `batchSize` reached or on timer. Use `batchFlushIntervalSeconds: 0` for size-only flush; `batchSize: 0` for timer-only flush.
450
+
- **Auto-create Tables**: When `rawMode: true` — creates table with `value` JSONB, `_metadata` JSONB, created_at, updated_at, deleted_at and GIN index. When `rawMode: false` — infers table structure from the first message (replicates source schema).
451
+
- **Raw Mode**: When true, expects `{"value": <data>, "_metadata": {...}}` and creates table with value/_metadata columns. When false, uses columnar format from message.
416
452
- **UPSERT Mode**: Updates existing records on conflict (PRIMARY KEY or `conflictKey`)
453
+
- **Soft Delete**: When `softDeleteColumn` is set and message has `metadata.operation=delete`, performs `UPDATE ... SET deleted_at = NOW()` instead of physical DELETE
Copy file name to clipboardExpand all lines: docs/ru/connectors.md
+50-36Lines changed: 50 additions & 36 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -210,7 +210,7 @@ sink:
210
210
211
211
## PostgreSQL
212
212
213
-
PostgreSQL коннектор поддерживает чтение из таблиц и запись в таблицы PostgreSQL. Поддерживает кастомные SQL запросы, периодический опрос и батч-вставки.
213
+
PostgreSQL коннектор поддерживает чтение из таблиц и запись в таблицы PostgreSQL. Поддерживает кастомные SQL запросы, периодический опрос, батч-вставки, CDC-стиль отслеживания изменений (INSERT и UPDATE), soft delete и SecretRef для учётных данных.
214
214
215
215
### Источник (Source)
216
216
@@ -220,34 +220,45 @@ PostgreSQL коннектор поддерживает чтение из таб
220
220
source:
221
221
type: postgresql
222
222
postgresql:
223
-
# Connection string (обязательно)
223
+
# Connection string (обязательно, или connectionStringSecretRef)
- **Периодический опрос**: Регулярно опрашивает таблицу на наличие новых данных
246
254
- **Кастомные запросы**: Поддержка сложных SQL запросов с JOIN, WHERE, и т.д.
247
-
- **Метаданные**: Каждое сообщение содержит метаданные:
248
-
- `table`- название таблицы
249
-
- **Формат данных**: Данные преобразуются в JSON формат
250
-
- **Режим сырой записи (rawMode)**: При включении каждая строка оборачивается в JSON с полями `value` (данные строки) и `_metadata` (table, id)
255
+
- **Метаданные**: Каждое сообщение содержит метаданные `table` и `operation` (insert/update)
256
+
- **Режим rawMode**: При включении каждая строка оборачивается в JSON с полями `value` (данные строки) и `_metadata` (table, id)
257
+
- **Размер батча чтения**: Ограничивает количество строк за один опрос для снижения нагрузки на БД
258
+
- **Отслеживание обновлений**: По умолчанию отслеживает изменения по колонке `updated_at` (или `changeTrackingColumn`), захватывает INSERT и UPDATE
259
+
- **Автосоздание таблицы**: Создаёт таблицу с CDC-совместимой схемой (id, created_at, updated_at), если не существует
260
+
- **Схема таблицы**: Имя таблицы поддерживает формат `schema.table` (напр. `public.products`)
261
+
- **Состояние в памяти**: Позиция чтения (lastReadChangeTime) хранится только в памяти. При перезапуске пода/коннектора происходит полное перечитывание таблицы. Для pg→pg включите `upsertMode: true` в sink, чтобы дубликаты обновлялись, а не вставлялись повторно.
- **Батч-вставки**: Группирует сообщения для эффективной записи. По умолчанию сброс при достижении `batchSize` или по таймеру (10 с). Только по размеру: `batchFlushIntervalSeconds: 0`. Только по времени: `batchSize: 0`
311
-
- **Автосоздание таблиц**: Автоматически создает таблицы с JSONB полем
312
-
- **Гибкая схема**: Поддерживает как JSONB (для автосозданных таблиц), так и колоночный формат
313
-
- **Индексы**: Автоматически создает GIN индекс на JSONB поле для быстрого поиска
314
-
- **UPSERT режим**: Поддерживает обновление существующих записей при конфликте по PRIMARY KEY или указанному ключу
318
+
- **Батч-вставки**: Группирует сообщения для эффективной записи. Сброс при достижении `batchSize` или по таймеру. Только по размеру: `batchFlushIntervalSeconds: 0`. Только по времени: `batchSize: 0`
319
+
- **Автосоздание таблиц**: При `rawMode: true` — создаёт таблицу с колонками `value` JSONB, `_metadata` JSONB, created_at, updated_at, deleted_at и GIN индексом. При `rawMode: false` — выводит структуру таблицы из первого сообщения (реплицирует схему источника)
320
+
- **Режим rawMode**: При true ожидает `{"value": <данные>, "_metadata": {...}}` и создаёт таблицу с колонками value/_metadata. При false использует колоночный формат из сообщения
321
+
- **UPSERT режим**: Обновляет существующие записи при конфликте по PRIMARY KEY или указанному `conflictKey`
322
+
- **Soft delete**: При заданном `softDeleteColumn` и `metadata.operation=delete` выполняет `UPDATE ... SET deleted_at = NOW()` вместо физического DELETE
0 commit comments