Recherches de lignes par lots avec node-postgres

Lisez les lignes par clé primaire avec votre connexion ou votre pool node-postgres existant.

Démarrez la démo, installez les dépendances et exécutez ses assertions d’intégration :

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

Envoyer une requête paramétrée

Avec un client ou un pool node-postgres connecté :

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 renvoie text[]. array_to_json envoie le tableau externe en JSON, donc node-postgres applique son décodeur JSON. Chaque élément non nul est une ligne sérialisée qui nécessite JSON.parse ; les positions correspondent aux positions d’entrée, et les clés absentes ou les entrées nulles produisent null.

Gardez le nom de table fixe dans le code applicatif. Passez les ID comme paramètres de requête, et non dans du SQL assemblé à partir de chaînes. Consultez la documentation node-postgres sur les paramètres et les instructions préparées nommées.

Le helper exécutable rejette les lots de plus de 1 024 clés et renvoie [] sans requête pour un lot vide. Il utilise des ID de démo entiers sûrs. Les champs PostgreSQL bigint et numeric dans le JSON peuvent dépasser la plage numérique exacte de JavaScript ; utilisez un parseur JSON sans perte ou un contrat de sérialisation explicite pour ces valeurs.

Comparer avec la requête par lots existante

La référence utilise :

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

ANY ne conserve ni l’ordre d’entrée ni les positions demandées en double. L’exemple les restaure côté client et fournit une valeur nulle pour les lignes absentes avant de comparer les résultats.

L’implémentation exécutable se trouve dans examples/node-postgres. Le helper reçoit un client existant au lieu de créer un pool par appel.

Transactions et limites applicatives

Utilisez un même client acquis pendant toute une transaction. Les lectures après des écritures dans la même transaction utilisent le chemin de la table source PostgreSQL. La démo le vérifie avec des connexions de lecture et d’écriture séparées ; consultez l’invalidation du cache.

Instructions préparées et cache des résultats

Une requête node-postgres nommée réutilise une instruction préparée sur chaque connexion. Elle ne met pas en cache les lignes renvoyées. local_cache.mget ajoute un cache partagé séparé de lignes complètes dans PostgreSQL ; le client envoie toujours une requête et décode son résultat. Consultez le guide de décision sur la mise en cache pour comparer les couches et le guide des recherches par lots pour une alternative SQL uniquement qui conserve les positions demandées.

Pour RESP2, utilisez l’exemple RESP Node.js. Les résultats Node.js enregistrés incluent des lectures par lots et des mises à jour concurrentes. Le benchmark commun exécute Node.js et Go dans les mêmes scénarios SQL et RESP.

Mis à jour .