Consultas por lotes de filas con node-postgres

Lee filas por clave primaria usando tu conexión o pool existente de node-postgres.

Inicia la demo, instala las dependencias y ejecuta sus aserciones de integración:

npm --prefix examples/node-postgres ci --ignore-scripts
npm --prefix examples/node-postgres run demo

Envía una consulta parametrizada

Dado un cliente o pool de node-postgres conectado:

const result = await client.query({
  name: 'items-mget',
  text: "SELECT array_to_json(local_cache.mget('public.items'::regclass, $1::bigint[])) AS rows",
  values: [[42, 7, 42, null, 999999]],
});
const rows = result.rows[0].rows.map(row =>
  row === null ? null : JSON.parse(row)
);

mget devuelve text[]. array_to_json envía el array exterior como JSON, por lo que node-postgres aplica su descodificador JSON. Cada elemento no nulo es una fila serializada y necesita JSON.parse; las posiciones coinciden con las posiciones de entrada, y las claves ausentes o las entradas nulas producen null.

Mantén fijo el nombre de la tabla en el código de la aplicación. Pasa los ID como parámetros de consulta, no como SQL ensamblado a partir de cadenas. Consulta la documentación de node-postgres sobre parámetros y sentencias preparadas con nombre.

El helper ejecutable rechaza lotes de más de 1.024 claves y devuelve [] sin hacer una consulta para un lote vacío. Usa ID de demostración que son enteros seguros. Los campos bigint y numeric de PostgreSQL en JSON pueden superar el rango numérico exacto de JavaScript; usa un parser JSON sin pérdida o un contrato de serialización explícito para esos valores.

Compara con la consulta por lotes existente

La línea base usa:

SELECT id::text AS key, row_to_json(i)::text AS row
FROM public.items AS i
WHERE id = ANY($1::bigint[]);

ANY no conserva el orden de entrada ni las posiciones solicitadas duplicadas. El ejemplo las restaura en el cliente y proporciona null para las filas ausentes antes de comparar los resultados.

La implementación ejecutable está en examples/node-postgres. El helper recibe un cliente existente en vez de crear un pool en cada llamada.

Transacciones y límites de la aplicación

Usa un único cliente adquirido durante toda una transacción. Las lecturas posteriores a las escrituras en la misma transacción usan el recorrido de la tabla de origen de PostgreSQL. La demo lo comprueba con conexiones de lectura y escritura separadas; consulta invalidación de caché.

Sentencias preparadas y caché de resultados

Una consulta con nombre de node-postgres reutiliza una sentencia preparada en cada conexión. No almacena en caché las filas devueltas. local_cache.mget añade una caché compartida separada de filas completas dentro de PostgreSQL; el cliente sigue enviando una consulta y descodificando su resultado. Consulta la guía para decidir la caché para comparar las capas y la guía de consultas por lotes para una alternativa solo SQL que conserva las posiciones solicitadas.

Para RESP2, usa el ejemplo RESP de Node.js. Los resultados registrados de Node.js incluyen lecturas por lotes y actualizaciones concurrentes. El benchmark común ejecuta Node.js y Go mediante los mismos escenarios SQL y RESP.

Actualizado .