Пакетное чтение строк с node-postgres

Читайте строки по первичному ключу через существующее соединение или пул node-postgres.

Сначала запустите демонстрацию, установите зависимости и выполните её интеграционные проверки:

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

Отправьте один параметризованный запрос

Для подключённого клиента или пула node-postgres:

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 возвращает text[]. array_to_json отправляет внешний массив как JSON, поэтому node-postgres применяет декодер JSON. Каждый ненулевой элемент является сериализованной строкой и требует JSON.parse; позиции соответствуют входным, а отсутствующие ключи или null-вход дают null.

Имя таблицы храните фиксированным в коде приложения. Передавайте ID как параметры запроса, а не собирайте SQL из строк. См. документацию node-postgres о параметрах и именованных подготовленных операторах.

Запускаемый помощник отклоняет пакеты более чем из 1 024 ключей и возвращает [] без запроса для пустого пакета. Он использует демонстрационные ID в безопасном целочисленном диапазоне. Поля PostgreSQL bigint и numeric в JSON могут выйти за пределы точного числового диапазона JavaScript; используйте JSON-парсер без потерь или явно определённый контракт сериализации таких значений.

Сравните с существующим пакетным запросом

Базовый вариант использует:

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

ANY не сохраняет порядок входных данных и повторяющиеся запрошенные позиции. Пример восстанавливает их на клиенте и подставляет null для отсутствующих строк, прежде чем сравнить результаты.

Запускаемая реализация находится в examples/node-postgres. Помощник принимает существующий клиент, а не создаёт пул при каждом вызове.

Транзакции и границы приложения

На протяжении транзакции используйте один полученный клиент. Чтения после записей в той же транзакции используют путь исходной таблицы PostgreSQL. Демонстрация проверяет это отдельными соединениями читателя и записывающего сеанса; см. инвалидацию кэша.

Подготовленные операторы и кэширование результатов

Именованный запрос node-postgres повторно использует подготовленный оператор на каждом соединении. Он не кэширует возвращённые строки. local_cache.mget добавляет отдельный общий кэш целых строк внутри PostgreSQL; клиент по-прежнему отправляет запрос и декодирует его результат. См. руководство по выбору кэширования, где сравниваются эти уровни, и руководство по пакетному чтению с SQL-альтернативой, которая сохраняет запрошенные позиции.

Для RESP2 используйте пример RESP для Node.js. Записанные результаты Node.js включают пакетное чтение и конкурентные обновления. Общий бенчмарк прогоняет Node.js и Go через одинаковые сценарии SQL и RESP.

Обновлено .