¿Por qué necesitas una base de datos?
Una automatización sin persistencia es como un camarero que nunca anota los pedidos. Puede recibir cientos de webhooks, pero si no guarda los datos en una fuente de verdad, toda la información se pierde en la siguiente ejecución.
Analogía del Archivador
n8n es el empleado que hace el trabajo, SQLite/PostgreSQL es el archivador metálico donde quedan los registros para siempre. Google Sheets es tu pizarra colaborativa visible.
La base de datos cumple tres funciones:
- Durabilidad: los datos sobreviven reinicios del contenedor n8n.
- Consultabilidad: puedes hacer preguntas como "¿cuántos leads entraron esta semana?"
- Integridad: si un flujo falla, los datos ya grabados no se pierden.
El Nodo Execute Query — Puerta al SQL
El nodo Postgres (y su equivalente MySQL) permite ejecutar instrucciones SQL directamente desde n8n. No necesitas un backend externo.
| Parámetro | Valor | Nota |
|---|---|---|
| Host | localhost |
O la IP de tu instancia (ej. 10.0.0.15) |
| Puerto | 5432 |
PostgreSQL. MySQL usa 3306 |
| Database | n8n_db |
Nombre exacto del schema |
| User | n8n_user |
Con permisos de escritura |
| Password | tu_contraseña |
Jamás hardcodees—utiliza Variables o un archivo .env |
| SSL | require (OCI) |
Obligatorio en producción. En local: disable |
Error común
Si configuras la conexión y ves ECONNREFUSED, el contenedor de la base de datos no está accesible o el puerto está cerrado. Verifica con: docker exec n8n nslookup <host>
Operaciones CRUD con SQL
El comportamiento del nodo cambia según la operación seleccionada. Esta tabla resume las 4 operaciones fundamentales con ejemplos reales.
| Operación | SQL equivalente | Escenario n8n típico |
|---|---|---|
| Insert | INSERT INTO leads (nombre, email) VALUES ('GABRIELES', '@') |
Post-webhook guarda nuevo lead. |
| Select | SELECT * FROM leads WHERE email = 'pre@ejemplo.com' |
Verificar si ya existe antes de insertar. |
| Update | UPDATE leads SET status = 'contactado' WHERE id = 42 |
Marcar lead como completado. |
| Delete | DELETE FROM logs WHERE created_at < now() - 30 |
Limpiar logs viejos (mantenimiento automático). |
Regla de Oro: Parametrización
Nunca concatenes variables en tu sentencia SQL. Usa el modo Query Parameters. Ejemplo: INSERT INTO leads (nombre) VALUES ($1) — y pasas $json.body.nombre como parámetro. n8n la hace segura. Evitas SQL Injection.
Google Sheets — la alternativa NoCode
Cuando no necesitas una base de datos real o tu cliente quiere ver los datos en "excel", el nodo Google Sheets es la respuesta. Autenticación OAuth2 (Google Drive). Usa el modo Append para añadir filas a una hoja existente. Los encabezados de columna deben coincidir exactamente con los campos JSON entrantes — usa el modo Automático: "Automatically map incoming data to matching column names in Postgres" (por el nodo Sheets).
| Caso | Mejor opción | Razón |
|---|---|---|
| 100 leads/día, integridad crítica | PostgreSQL | Transacción y soporte de índice |
| Dashboard visual compartido con el cliente | GOM Sheets | Visible sin acceso al servidor |
| Registro de errores en producción | PostgreSQL | Los logs no deben ser accesibles desde una URL pública |
Checklist del Módulo 07
Desafío de Arquitecto
Webhook → PostgreSQL: Pipeline Persistente
Tu primer cliente te pide un sistema de registro de leads sin base de datos. El proceso esperado:
- Crea un workflow con Webhook Trigger (POST, path:
/nuevo-lead) - Conecta un nodo Execute Query configurado contra tu PostgreSQL
- Usa un Code Node para definir la operación: registro único (verifica si el email ya existe)
- Si no existe → INSERT → notifica a Telegram. Si ya existe → Devuelves un mensaje 200 OK diciendo que ya estaba registrado.
- Envía un POST desde Postman con JSON válido y verifica que aparezca en tu tabla PostgreSQL