MySQL и PostgreSQL в n8n: SQL-запросы, upsert, отчёты и безопасность ¶
Обновлено: 2026-05-29
MySQL и PostgreSQL в n8n используют для трёх больших задач: читать данные из существующих систем, записывать события/заявки и строить устойчивые процессы с дедупликацией. SQL-ноды дают больше контроля, чем таблицы, но требуют аккуратности: ошибка в запросе может создать дубли, перезаписать данные или открыть доступ к лишним таблицам.
Не начинайте с полного доступа
Для n8n создавайте отдельного пользователя БД с минимальными правами. Workflow для отчётов не должен иметь право удалять строки, а workflow для записи лидов не должен видеть служебные таблицы.
Когда брать MySQL, а когда PostgreSQL ¶
| Ситуация | Что чаще выбрать | Комментарий |
|---|---|---|
| legacy-сайт или CMS уже на MySQL | MySQL | n8n подключается к существующей базе |
| новая production-автоматизация | PostgreSQL | удобнее для JSONB, отчётов, idempotency и очередей |
| лог событий webhook | PostgreSQL | хорошо хранить raw event и normalized payload |
| простые чтения каталога | MySQL или Postgres | зависит от текущей инфраструктуры |
| RAG/vector сценарии | PostgreSQL/pgvector или Qdrant | не путать с обычной БД n8n |
Базовый контракт таблицы событий ¶
Для n8n часто полезна таблица, которая хранит входящие события и защищает от повторной обработки. Минимальный набор полей:
CREATE TABLE inbound_events (
id bigserial PRIMARY KEY,
external_id text NOT NULL,
source_system text NOT NULL,
event_type text NOT NULL,
payload jsonb,
status text NOT NULL DEFAULT 'new',
received_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (source_system, external_id)
);
Если внешний сервис повторно отправил webhook, уникальный ключ не даст создать дубль. Workflow сможет понять, что событие уже было, и вернуть корректный ответ.
Upsert вместо слепого insert ¶
Самая частая ошибка — делать insert на каждую заявку. Для webhook, оплат, лидов и писем лучше использовать upsert: создать, если записи нет; обновить, если она уже существует. В PostgreSQL это обычно делается через ON CONFLICT.
INSERT INTO inbound_events (external_id, source_system, event_type, payload)
VALUES ($1, $2, $3, $4::jsonb)
ON CONFLICT (source_system, external_id)
DO UPDATE SET payload = EXCLUDED.payload, received_at = now();
В n8n значения для запроса берите из уже нормализованных полей, а не из сырого тела webhook. Так меньше риск перепутать путь JSON.
SQL-запросы и пользовательский ввод ¶
Не собирайте SQL конкатенацией из пользовательских полей: телефона, email, текста формы, поискового запроса. Даже если workflow “внутренний”, данные могут прийти из webhook. Лучше использовать параметры, whitelists и заранее подготовленные поля. Если нужно динамически выбрать таблицу или колонку, ограничьте список допустимых значений через Switch или Code node.
Отчёты и выгрузки ¶
SQL-ноды удобны для ежедневных отчётов: заявки за день, оплаты по статусам, ошибки по типам, лиды без ответственного. Но отчётный запрос не должен блокировать production-таблицы. Для тяжёлых выборок используйте индексы, ограничение по дате, pagination и отдельные read-only credentials.
SELECT event_type, count(*) AS cnt
FROM inbound_events
WHERE received_at >= now() - interval '1 day'
GROUP BY event_type
ORDER BY cnt DESC;
Типовые ошибки подключения ¶
| Симптом | Причина | Что проверить |
|---|---|---|
| ECONNREFUSED | БД недоступна с контейнера n8n | host, port, docker network, firewall |
| permission denied | у пользователя нет прав | GRANT только на нужные таблицы |
| SSL error | сервер требует SSL или наоборот | настройки credentials и провайдера |
| duplicate key | insert без upsert | ON CONFLICT или предварительная проверка |
| слишком долго выполняется | нет индекса или большой диапазон | EXPLAIN, индекс, фильтр по дате |
Как не сломать базу из n8n ¶
- Создавайте отдельные credentials для read-only и write workflow.
- Не используйте root/admin-пользователя БД.
- Проверяйте SQL на тестовой базе перед запуском.
- Для destructive-запросов добавляйте ручное подтверждение.
- Логируйте external_id и результат записи.
- Делайте backup перед массовым update.
Связанные материалы ¶
- Postgres node — отдельный справочник по ноде.
- PostgreSQL для self-hosted n8n — база самого n8n и бэкапы.
- Webhook idempotency — защита от повторных событий.
- Supabase и n8n — managed Postgres и API.
Практическое применение страницы
Материал «MySQL и PostgreSQL в n8n: SQL-запросы, upsert, отчёты и безопасность ¶» лучше использовать как точку входа в рабочий маршрут, а не как изолированную справку. Перед внедрением выберите конкретный процесс, источник данных, владельца и ожидаемый результат. Это помогает быстро понять, какая страница базы нужна дальше: рецепт, диагностика, интеграция, нода или production-playbook.
Для любой автоматизации в n8n полезно заранее описать входной item, обязательные поля, внешние сервисы, write-действия и способ отката. Если эти детали не зафиксированы, даже простой workflow может стать неуправляемым: дублирует заявки, теряет часть items, отправляет уведомления не тем людям или ломается при изменении формата API.
Минимальный чеклист
- Определите, что является успешным результатом и кто его подтверждает.
- Проверьте happy path, пустой вход, повтор события и сбой внешнего сервиса.
- Добавьте логирование execution id, source, external id и статуса без секретов.
- Свяжите страницу с ближайшим рецептом, ошибкой или playbook.
Что открыть дальше
- Интеграции — открыть связанный материал для проверки контекста.
- Рецепты — открыть связанный материал для проверки контекста.
- Диагностика — открыть связанный материал для проверки контекста.
- OAuth checklist — открыть связанный материал для проверки контекста.