Перейти к содержанию

MySQL и PostgreSQL в n8n: SQL-запросы, upsert, отчёты и безопасность

Обновлено: 2026-05-29

Открыть мой план

MySQL и PostgreSQL в n8n используют для трёх больших задач: читать данные из существующих систем, записывать события/заявки и строить устойчивые процессы с дедупликацией. SQL-ноды дают больше контроля, чем таблицы, но требуют аккуратности: ошибка в запросе может создать дубли, перезаписать данные или открыть доступ к лишним таблицам.

Не начинайте с полного доступа

Для n8n создавайте отдельного пользователя БД с минимальными правами. Workflow для отчётов не должен иметь право удалять строки, а workflow для записи лидов не должен видеть служебные таблицы.

Когда брать MySQL, а когда PostgreSQL

СитуацияЧто чаще выбратьКомментарий
legacy-сайт или CMS уже на MySQLMySQLn8n подключается к существующей базе
новая production-автоматизацияPostgreSQLудобнее для JSONB, отчётов, idempotency и очередей
лог событий webhookPostgreSQLхорошо хранить 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БД недоступна с контейнера n8nhost, port, docker network, firewall
permission deniedу пользователя нет правGRANT только на нужные таблицы
SSL errorсервер требует SSL или наоборотнастройки credentials и провайдера
duplicate keyinsert без upsertON CONFLICT или предварительная проверка
слишком долго выполняетсянет индекса или большой диапазонEXPLAIN, индекс, фильтр по дате

Как не сломать базу из n8n

  • Создавайте отдельные credentials для read-only и write workflow.
  • Не используйте root/admin-пользователя БД.
  • Проверяйте SQL на тестовой базе перед запуском.
  • Для destructive-запросов добавляйте ручное подтверждение.
  • Логируйте external_id и результат записи.
  • Делайте backup перед массовым update.

Связанные материалы

Практическое применение страницы

Материал «MySQL и PostgreSQL в n8n: SQL-запросы, upsert, отчёты и безопасность ¶» лучше использовать как точку входа в рабочий маршрут, а не как изолированную справку. Перед внедрением выберите конкретный процесс, источник данных, владельца и ожидаемый результат. Это помогает быстро понять, какая страница базы нужна дальше: рецепт, диагностика, интеграция, нода или production-playbook.

Для любой автоматизации в n8n полезно заранее описать входной item, обязательные поля, внешние сервисы, write-действия и способ отката. Если эти детали не зафиксированы, даже простой workflow может стать неуправляемым: дублирует заявки, теряет часть items, отправляет уведомления не тем людям или ломается при изменении формата API.

Минимальный чеклист

  • Определите, что является успешным результатом и кто его подтверждает.
  • Проверьте happy path, пустой вход, повтор события и сбой внешнего сервиса.
  • Добавьте логирование execution id, source, external id и статуса без секретов.
  • Свяжите страницу с ближайшим рецептом, ошибкой или playbook.
  • Интеграции — открыть связанный материал для проверки контекста.
  • Рецепты — открыть связанный материал для проверки контекста.
  • Диагностика — открыть связанный материал для проверки контекста.
  • OAuth checklist — открыть связанный материал для проверки контекста.