Guide

Lavorare con i Database: Connettere n8n a PostgreSQL o MySQL

Vuoi trasformare fogli, CRM e fonti web in insight azionabili senza riscrivere script ogni settimana? Collegare n8n a un database relazionale ti permette di costruire pipeline ETL/ELT robuste per reporting, enrichment e sincronizzazioni bidirezionali. Con mysql n8n e l’equivalente per PostgreSQL puoi orchestrare import da CSV/Google Sheets, upsert transazionali, dedup e job schedulati con osservabilità. In questa guida pratica vedrai come scegliere l’architettura giusta, configurare i nodi database, scrivere query sicure con parametri dinamici, gestire batching e paginazione, e – quando serve – migrare n8n da SQLite a un database esterno per scalare in produzione. Troverai snippet pronti all’uso, configurazioni esatte dei nodi e best practice per sicurezza (SSL/TLS, least privilege), resilienza (retry/backoff) e controllo costi (rate limit, caching dei delta). Obiettivo: un blueprint chiaro per integrare dati in modo affidabile, con tempi e risultati prevedibili.

📚 Nuovo a n8n? Parti dalla guida completa: cos’è n8n e come funziona.

[IMG: Panoramica workflow n8n con Google Sheets → Code (normalize) → Split In Batches → MySQL/PostgreSQL → Slack report]


Perché collegare n8n a PostgreSQL o MySQL: casi d’uso e architetture

Collegare n8n a un RDBMS apre tre macro‑scenari per marketer e ops:

  • Integrazioni ETL/ELT e reporting: centralizza dati da Google Sheets, CRM, piattaforme adv e strumenti di support in tabelle normalizzate per BI e dashboard.
  • Sincronizzazioni bidirezionali: allinea anagrafiche e attributi (consenso, segmenti) tra sorgenti diverse, con operazioni CRUD e upsert nei database.
  • Automazioni su eventi: scatta azioni quando arrivano nuovi record (lead, ordini, ticket), arricchisci e scrivi in output su PostgreSQL/MySQL.

Pattern architetturali tipici:

  • Staging → Master: carica dati grezzi in tabelle staging, normalizza e consolida in tabelle master con idempotenza e dedup.
  • Hub & Spoke: il DB funge da “hub” per orchestrare arrivi/uscite (CRM, sheet, email marketing), con job schedulati che leggono/scrivono.
  • Event‑driven: usa trigger in ingresso (webhook, cron) per aggiornare il DB e scatenare flussi downstream (es. alert Slack se threshold superati).

Benefici pratici per i team marketing:

  • Meno copia‑incolla, più consistenza: il database diventa la “fonte di verità” con storicizzazione e tracciabilità.
  • Query ad‑hoc: rispondi a domande operative velocemente (KPI per campagna, segmenti) con data freschi e certificati.
  • Scalabilità: con batching e pianificazione, i job restano affidabili anche con volumi crescenti.

Parole chiave da mettere a terra: integrazione di n8n con PostgreSQL, integrazione di n8n con MySQL, importare CSV o Google Sheets in un database con n8n, sincronizzazione dati tra CRM e database.


Configurare le connessioni nei workflow: nodi, credenziali e sicurezza

In n8n, l’accesso ai database avviene tramite nodi specifici e credenziali salvate in modo sicuro. I nodi di riferimento:

  • nodo MySQL in n8n: type “n8n-nodes-base.mySql”
  • nodo PostgreSQL in n8n: type “n8n-nodes-base.postgres”

Ogni nodo referenzia una credenziale pre‑configurata:

  • MySQL credentials: campo credentials “mySql” con il nome della credenziale (es. “My MySQL DB”)
  • PostgreSQL credentials: campo credentials “postgreSql” con il nome della credenziale (es. “Your PostgreSQL DB”)

Esempio: MySQL “Execute Query” con parametro dinamico

{
  "name": "MySQL Query",
  "type": "n8n-nodes-base.mySql",
  "typeVersion": 2,
  "parameters": {
    "operation": "executeQuery",
    "query": "SELECT * FROM users WHERE id = {{ $json[\"user_id\"] }}"
  },
  "credentials": {
    "mySql": { "name": "My MySQL DB" }
  }
}

Esempio: PostgreSQL “Execute Query” con parametro dinamico

{
  "name": "PostgreSQL Query",
  "type": "n8n-nodes-base.postgres",
  "typeVersion": 2,
  "parameters": {
    "operation": "executeQuery",
    "query": "SELECT * FROM users WHERE id = {{ $json[\"user_id\"] }}"
  },
  "credentials": {
    "postgreSql": { "name": "Your PostgreSQL DB" }
  }
}

Sicurezza:

  • Utenti con privilegi minimi: crea un utente DB con permessi strettamente necessari (SELECT/INSERT/UPDATE su schemi/tabelle target).
  • SSL/TLS: abilita SSL lato server e usa connessioni cifrate quando possibile. Se il provider lo richiede, configura i certificati/CA nelle credenziali o nell’infrastruttura di rete.
  • Requisiti di rete: metti in allowlist gli IP di uscita di n8n o posiziona n8n e DB nella stessa VPC.

[IMG: Schermata credenziali n8n con connessione MySQL e Postgres configurate]


Query sicure e performanti: CRUD, upsert e parametrizzazione

Con i nodi database puoi eseguire query personalizzate (Execute Query) e coprire operazioni CRUD e upsert. Le espressioni di n8n permettono di passare valori dinamici da item precedenti.

Linee guida per query parametrizzate in n8n:

  • Evita di concatenare stringhe con input non sanificati: preferisci espressioni su id/valori convalidati (regex/whitelist).
  • Prevenzione SQL injection nelle automazioni: valida sempre gli input provenienti da sistemi esterni (email, form, webhooks).

Esempi pratici (eseguiti via Execute Query):

SELECT con parametro

SELECT id, email, created_at
FROM users
WHERE email = {{ $json["email"] }};

INSERT

INSERT INTO users (name, email, source)
VALUES ({{ $json["name"] }}, {{ $json["email"] }}, 'campaign-2025');

UPDATE

UPDATE users
SET last_seen_at = NOW()
WHERE id = {{ $json["id"] }};

DELETE

DELETE FROM users
WHERE id = {{ $json["id"] }};

Upsert (PostgreSQL)

INSERT INTO users (id, name, email)
VALUES ({{ $json["id"] }}, {{ $json["name"] }}, {{ $json["email"] }})
ON CONFLICT (id) DO UPDATE
SET name = EXCLUDED.name, email = EXCLUDED.email;

Upsert (MySQL)

INSERT INTO users (id, name, email)
VALUES ({{ $json["id"] }}, {{ $json["name"] }}, {{ $json["email"] }})
ON DUPLICATE KEY UPDATE
name = VALUES(name), email = VALUES(email);

Consigli:

  • Differenze sintattiche principali tra PostgreSQL e MySQL: LIMIT/OFFSET, funzioni date/time, tipi JSON (json vs jsonb), upsert (ON CONFLICT vs ON DUPLICATE KEY).
  • Idempotenza e gestione duplicati: scegli chiavi uniche e costruisci upsert per evitare inserimenti ripetuti.

Paginazione, batching e pooling: performance e resilienza operativa

Per grandi volumi, aggira timeout e limiti con un disegno robusto.

Paginazione e batching nei workflow:

  • Leggi a blocchi dal sorgente (LIMIT/OFFSET o keyset pagination) e spingi a valle con “Split In Batches” (es. 50–200 righe a batch).
  • Keyset pagination (WHERE id > last_id) è preferibile su LIMIT/OFFSET per dataset ampi: è più stabile e performante.

Pattern di controllo:

  • “Split In Batches” → node DB (executeQuery) → IF (error?) → Wait (1–3s) → Execute Next Batch → “No Items” → report.
  • Retry con backoff: su errori temporanei (lock, deadlock, 5xx), riprova 1–3 volte (2s → 5s → 10s).

Pooling delle connessioni database:

  • Evita aprire/chiudere connessioni ad alta frequenza. Mantieni un batch per transazione logica e limita la concorrenza.
  • Se lavori con più nodi DB in parallelo, riduci il parallelismo per diminuire lock e aumentare throughput stabile.

Paginazione e batching nei report:

  • Per estrazioni massicce, usa finestre temporali (createdat/updatedat) e salva lo “stato ultimo” per estrarre solo i delta.

[IMG: Sequenza Split In Batches → Execute Query → IF error → Wait → Execute Next Batch]


Migrare n8n da SQLite a un database esterno: variabili d’ambiente e note di deploy

Quando e perché sostituire SQLite:

  • Produzione multi‑utente, storicizzazione esecuzioni e credenziali, requisiti di alta affidabilità e backup facili.
  • Coordinamento tra più worker/containers.

PostgreSQL (esempio Docker)

docker run -it --rm \
  --name n8n \
  -p 5678:5678 \
  -e DB_TYPE=postgresdb \
  -e DB_POSTGRESDB_DATABASE=<POSTGRES_DATABASE> \
  -e DB_POSTGRESDB_HOST=<POSTGRES_HOST> \
  -e DB_POSTGRESDB_PORT=<POSTGRES_PORT> \
  -e DB_POSTGRESDB_USER=<POSTGRES_USER> \
  -e DB_POSTGRESDB_SCHEMA=<POSTGRES_SCHEMA> \
  -e DB_POSTGRESDB_PASSWORD=<POSTGRES_PASSWORD> \
  -v n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n

MySQL (indicazioni)

  • Imposta: DB_TYPE=mysqldb e le variabili corrispondenti per host, database, user, password, port (pattern: DB_MYSQLDB_*).
  • Assicurati che l’utente disponga dei permessi necessari e che la rete consenta la connessione (allowlist/VPC).

Note operative:

  • Migrazioni schema: al primo avvio con DB esterno, n8n applica le migrazioni; monitora i log.
  • SSL/TLS: abilita cifratura end‑to‑end; se usi certificati custom, assicurane la disponibilità nel container/host.
  • Container: monta un volume persistente per la home n8n (/home/node/.n8n) e per il DB.
  • Backup: programma dump periodici del DB e snapshot del volume n8n.

[IMG: Estratto di docker-compose con servizi n8n e Postgres collegati in rete privata]


Esempi pratici: import CSV/Sheets e sincronizzazione CRM → DB

Importare CSV o Google Sheets in un database con n8n

  • Google Sheets → Code (normalize) → Split In Batches (100) → MySQL/PostgreSQL (Execute Query: INSERT/UPSERT) → Slack report.
  • Normalizza email/phone, valida chiavi e applica upsert per idempotenza.

Snippet INSERT/UPSERT (MySQL ON DUPLICATE KEY)

INSERT INTO contacts (email, first_name, last_name, utm_source)
VALUES ({{ $json["email"] }}, {{ $json["first"] }}, {{ $json["last"] }}, {{ $json["utm"] }})
ON DUPLICATE KEY UPDATE
first_name = VALUES(first_name),
last_name  = VALUES(last_name),
utm_source = VALUES(utm_source);

Sincronizzazione dati tra CRM e database

  • CRM (HTTP Request/API) → Code (mapping) → DB upsert.
  • Esegui poll su updated_at/lastModified per delta‑load.
  • Scrivi una tabella “changeslog” con source, recordid, action, ts per audit.

Automazioni su eventi

  • Webhook (nuovo ordine/lead) → Validate → DB upsert → Trigger downstream (email, Slack, BI refresh).

[IMG: Canvas con Google Sheets → Split In Batches → Postgres (executeQuery) → Slack]


Osservabilità, errori e ottimizzazione costi

Error handling

  • IF su status/risultati query; su errori transitori, retry con backoff.
  • Ramo errori → log su tabella etl_errors con stack/message e payload minimizzato.

Timeouts e performance

  • Evita SELECT senza indice su grandi tabelle: aggiungi indici sulle chiavi di filtro/join.
  • Keyset pagination batte LIMIT/OFFSET su dataset ampi.

Costi e governance

  • Pianifica job in orari “soft” e raggruppa modifiche in batch per ridurre esecuzioni.
  • Least privilege sugli utenti DB e rotazione periodica delle credenziali (gestione segreti centralizzata).

Monitoraggio

  • Crea un report giornaliero: righe inserite/aggiornate, errori per job, durata media per batch.
  • Alert se errori > soglia o se la durata supera il budget.

Quick Takeaways

  • Usa i nodi “n8n-nodes-base.mySql” e “n8n-nodes-base.postgres” con credenziali dedicate e privilegi minimi.
  • Costruisci query con espressioni n8n solo su input validati per prevenire SQL injection.
  • Preferisci upsert per idempotenza: ON CONFLICT (PostgreSQL) e ON DUPLICATE KEY (MySQL).
  • Scala con Split In Batches, keyset pagination e retry con backoff; limita la concorrenza per stabilità.
  • Migra da SQLite a DB esterno in produzione: configura DB_TYPE e variabili d’ambiente, abilita SSL e backup.
  • Traccia esiti, errori e tempi: osservabilità e audit ti fanno risparmiare tempo e costi.

Conclusione

Portare i tuoi workflow su PostgreSQL/MySQL con n8n significa passare da automazioni “artigianali” a processi affidabili e misurabili. Con mysql n8n e l’equivalente per Postgres puoi eseguire query dinamiche, fare upsert idempotenti e orchestrare pipeline ETL/ELT con batching e paginazione efficienti. L’adozione di buone pratiche – input validati, privilegi minimi, SSL/TLS, retry con backoff e job schedulati – riduce gli incidenti e rende i dati pronti per decisioni rapide. Per i marketer, è il ponte tra operatività e insight: liste pulite, segmenti coerenti, report accurati. Inizia con un piccolo flusso (Sheets → DB con upsert), misura performance e qualità, poi estendi a CRM e canali: la robustezza del tuo data layer sarà un moltiplicatore di produttività per tutte le campagne.


FAQ

  1. Come collego n8n a MySQL o PostgreSQL in un workflow?

Crea le credenziali e usa i nodi dedicati (n8n-nodes-base.mySql o n8n-nodes-base.postgres). Imposta operation “executeQuery” e scrivi SQL con espressioni per passare parametri dinamici. Mantieni un utente DB con privilegi minimi.

  1. Come prevenire SQL injection nelle automazioni?

Valida e normalizza gli input prima di usarli in query. Evita concatenazioni di stringhe non sanificate; usa espressioni n8n su campi controllati. Limita i permessi dell’utente DB e monitora errori anomali.

  1. Posso fare upsert portabile tra PostgreSQL e MySQL?

Sì, via SQL: ON CONFLICT (PostgreSQL) e ON DUPLICATE KEY (MySQL). Esegui queste istruzioni con “executeQuery” e definisci chiavi/index unici sulle colonne di dedup.

  1. Quando migrare n8n da SQLite a un DB esterno?

In produzione, con più utenti o job intensivi. Configura DB_TYPE (postgresdb o mysqldb) e le variabili d’ambiente del DB; abilita SSL/TLS e pianifica backup. Al primo avvio, n8n applica le migrazioni schema.

  1. Come importare CSV o Google Sheets nel database?

Leggi dallo Sheet, normalizza in Code, usa Split In Batches e invia batch al nodo DB con INSERT/UPSERT. Aggiungi log e un report Slack per tenere traccia di righe inserite/aggiornate ed errori.


Ci dai una mano?

Qual è il primo flusso che porterai su DB: import da Sheets con upsert o sync dal CRM? Condividi la tua scelta e questo articolo con il team: confrontiamo pattern e costruiamo pipeline più affidabili per i prossimi lanci!

Articoli correlati

Vuoi automazioni AI su misura per la tua azienda?
Scopri la consulenza →

Partiamo da un processo che oggi vi costa ore

Su WhatsApp risponde una persona, di solito in giornata. Se preferisci scrivere con calma, c’è il modulo qui sotto.

Scrivici su WhatsApp

Raccontaci cosa vuoi automatizzare

Ti rispondiamo noi, di solito in giornata.

Raccontaci cosa vi fa perdere tempo

Due righe bastano. Vi diciamo se si automatizza, come, e quanto costa. Se non conviene, lo diciamo.