Batch-Zeilenabfragen mit node-postgres
Lesen Sie Zeilen per Primärschlüssel über Ihre bestehende node-postgres-Verbindung oder Ihren Pool.
Starten Sie die Demo, installieren Sie die Abhängigkeiten und führen Sie deren Integrationsprüfungen aus:
npm --prefix examples/node-postgres ci --ignore-scripts
npm --prefix examples/node-postgres run demo
Eine parametrisierte Abfrage senden
Mit einem verbundenen node-postgres-Client oder Pool:
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 gibt text[] zurück. array_to_json sendet das äußere Array als JSON,
damit node-postgres seinen JSON-Decoder anwendet. Jedes Element ungleich null
ist eine serialisierte Zeile und benötigt JSON.parse; die Positionen stimmen
mit den Eingabepositionen überein, fehlende Schlüssel oder Null-Eingaben ergeben
null.
Halten Sie den Tabellennamen im Anwendungscode fest. Übergeben Sie IDs als Query-Parameter, nicht als aus Strings zusammengesetztes SQL. Siehe die node-postgres-Dokumentation zu Parametern und benannten vorbereiteten Statements.
Der ausführbare Helfer weist Batches mit mehr als 1.024 Schlüsseln zurück und
gibt für einen leeren Batch ohne Abfrage [] zurück. Er verwendet sichere
Demo-IDs. PostgreSQL-bigint- und numerische Felder in JSON können den exakten
Zahlenbereich von JavaScript überschreiten; verwenden Sie für solche Werte einen
verlustfreien JSON-Parser oder einen expliziten Serialisierungsvertrag.
Mit der bestehenden Batch-Abfrage vergleichen
Die Baseline verwendet:
SELECT id::text AS key, row_to_json(i)::text AS row
FROM public.items AS i
WHERE id = ANY($1::bigint[]);
ANY erhält weder die Eingabereihenfolge noch doppelte angeforderte Positionen.
Das Beispiel stellt sie im Client wieder her und liefert fehlende Zeilen als
null, bevor es Ergebnisse vergleicht.
Die ausführbare Implementierung liegt in examples/node-postgres. Der Helfer nimmt einen vorhandenen Client statt für jeden Aufruf einen Pool zu erzeugen.
Transaktionen und Anwendungsgrenzen
Verwenden Sie innerhalb einer Transaktion durchgehend denselben entnommenen Client. Lesevorgänge nach Schreibvorgängen in derselben Transaktion verwenden den Quelltabellenpfad von PostgreSQL. Die Demo prüft dies mit getrennten Lese- und Schreibverbindungen; siehe Cache-Invalidation.
Vorbereitete Statements und Ergebnis-Caching
Eine benannte node-postgres-Abfrage verwendet auf jeder Verbindung ein
wiederverwendetes vorbereitetes Statement. Sie cached keine zurückgegebenen
Zeilen. local_cache.mget fügt einen separaten gemeinsamen Cache vollständiger
Zeilen in PostgreSQL hinzu; der Client sendet weiterhin eine Abfrage und dekodiert
deren Ergebnis. Siehe den Leitfaden zur Caching-Entscheidung
für den Vergleich der Ebenen und den Leitfaden zu Batch-Abfragen
für eine reine SQL-Alternative, die angeforderte Positionen erhält.
Für RESP2 verwenden Sie das Node.js-RESP-Beispiel. Aufgezeichnete Node.js-Ergebnisse enthalten Batch-Lesevorgänge und gleichzeitige Updates. Der gemeinsame Benchmark führt Node.js und Go durch dieselben SQL- und RESP-Szenarien.
Aktualisiert .