PostgreSQL
Recolección POSTGRES y Entrega POSTGRES_EXEC. La misma conexión atiende TimescaleDB, que es
una extensión de PostgreSQL — no hay un tipo separado para ella.
Conexión
Si la extensión TimescaleDB está instalada en la base, Probar Conexión muestra su versión junto
a la del servidor (PostgreSQL 16.2 (TimescaleDB 2.17.0)).
| Campo | Para qué sirve |
|---|---|
| Host / Puerto | Servidor PostgreSQL. Por defecto 5432 |
| Database | Base abierta en la conexión |
| Schema (search_path) | Schema predeterminado de las consultas. Vacío = public. Acepta un nombre simple; para alcanzar otro schema, califique la tabla en la propia consulta |
| Usuario / Contraseña | Usuario de la base |
| Modo SSL | Deshabilitado (sin TLS), Exigir TLS (cifra sin validar el certificado), Verificar CA (valida la cadena) o Verificar CA y hostname |
| Certificado de la CA (PEM) | Solo en los modos que verifican: pegue el certificado de la CA que firmó el certificado del servidor. Vacío cuando la CA es pública (ej.: RDS) |
| Application Name | Identifica la sesión del CMS en pg_stat_activity, en la base del cliente. Vacío = CMS |
| Query de Prueba (Keep Alive) | Misma función que en los demás. Vacío = SELECT 1 |
Verificar CA valida la cadena pero no el nombre del servidor — es el modo correcto cuando la
base se accede por IP y el certificado fue emitido para el nombre DNS, situación común en red
industrial. Los modos allow/prefer de libpq quedaron fuera a propósito: caen a texto plano en
silencio, y aquí es mejor que la conexión falle a que se degrade sin que nadie lo note.
El cast :: convive con los marcadores
El driver de PostgreSQL solo acepta parámetros posicionales ($1, $2), así que el CMS convierte
los :nombre del comando antes de ejecutar. La conversión entiende la sintaxis del dialecto: el
cast ::tipo no se confunde con un marcador, y :nombre dentro de una cadena, de un identificador
entre comillas, de un comentario o de un bloque $$...$$ sigue siendo texto, no bind.
INSERT INTO mediciones (ts, datos, planta)
VALUES (:datetime::timestamptz, :payload::jsonb, :PLANTA_PREDETERMINADA)Si un :nombre no corresponde a ningún Parámetro de Entrada, Variable o valor de mensaje, la
ejecución falla indicando qué marcador quedó sin valor — en lugar de dejar que la base responda con
un error de sintaxis que apunta a otro punto del comando.
TimescaleDB
No hay configuración específica: escribir en una hypertable es un INSERT común, y las funciones de
ventana de tiempo funcionan en la Query SELECT como cualquier otra función.
-- Recolección: promedio por franja de 5 minutos en la última hora
SELECT time_bucket('5 minutes', ts) AS franja, avg(valor) AS promedio
FROM mediciones
WHERE ts > now() - interval '1 hour'
GROUP BY franja ORDER BY franja;
-- Entrega en una hypertable, ignorando timestamp duplicado
INSERT INTO mediciones (ts, valor) VALUES (:datetime, :payload::numeric)
ON CONFLICT (ts) DO NOTHING;La Entrega ejecuta un comando por mensaje. Para ingesta de altísimo volumen, hoy el camino es
agrupar las muestras en un solo payload (vía Transformador) y grabarlas con un INSERT de varias
filas, en vez de un mensaje por muestra. La carga masiva nativa (COPY) no está disponible —
COPY está bloqueado por el guard.
Vocabulario bloqueado en este dialecto
Además del DDL/DCL vedado en todos los dialectos, este bloquea:
COPY, dblink, pg_read_file, pg_write_file, pg_ls_dir, lo_import, lo_export, pg_sleep, pg_terminate_backend
La verificación completa — verbo inicial, statements encadenados y la neutralización de comentarios y literales — está en lo que el CMS bloquea en los campos SQL.
El comportamiento común a las cuatro bases — modos de resultado, marcado de lo ya leído y marcadores — está en Bases de datos.