JS
#postgresql#node#pg#nodejs#database

PostgreSQL: Node.js (pg) — Pool, параметризованные запросы, JSONB

Подключение к PostgreSQL из Node.js через пакет pg: Pool, query с $1 $2, запросы по JSONB. Копируй — вставляй — работает. По документации node-postgres.

Как использовать

  1. Установи: npm i pg. Для TypeScript: npm i -D @types/pg.
  2. Подставь свои host, database, user, password (лучше из process.env).
  3. Всегда используй параметры $1, $2 — не подставляй значения в строку запроса.

Подключение к PostgreSQL из Node.js через официальный клиент node-postgres (pg). По Pooling, Queries, Pool API.


1. Установка и Pool

npm i pg
# TypeScript
npm i -D @types/pg
const { Pool } = require('pg');

const pool = new Pool({
  host: 'localhost',
  port: 5432,
  database: 'myapp',
  user: 'app_user',
  password: process.env.DB_PASSWORD,
  max: 20,
  idleTimeoutMillis: 30000,
  connectionTimeoutMillis: 2000,
});

module.exports = { pool };

2. Параметризованные запросы (защита от SQL-инъекций)

Параметры передаются вторым аргументом; в запросе — плейсхолдеры $1, $2, … Подстановка выполняется на стороне PostgreSQL.

const { pool } = require('./pool');

// SELECT
const res = await pool.query(
  'SELECT * FROM users WHERE id = $1',
  [userId]
);
const user = res.rows[0];

// INSERT с RETURNING
const insert = await pool.query(
  'INSERT INTO users (email, name) VALUES ($1, $2) RETURNING *',
  ['user@example.com', 'Alice']
);
const newUser = insert.rows[0];

// UPDATE
await pool.query(
  'UPDATE users SET name = $1 WHERE id = $2',
  ['Bob', userId]
);

3. Запросы по JSONB

Оператор @> (содержит) — передаём JSON-объект как параметр:

const { pool } = require('./pool');

const color = 'red';
const products = await pool.query(
  'SELECT * FROM products WHERE attrs @> $1',
  [JSON.stringify({ color })]
);

// Несколько полей
const filter = { brand: 'Apple', color: 'black' };
const list = await pool.query(
  'SELECT * FROM products WHERE attrs @> $1',
  [JSON.stringify(filter)]
);

Проверка ключа (?) и извлечение поля:

const byKey = await pool.query(
  "SELECT * FROM products WHERE attrs ? $1",
  ['brand']
);

const withBrand = await pool.query(
  "SELECT id, name, attrs->>'brand' AS brand FROM products"
);

4. Готовый пример: один файл

const { Pool } = require('pg');

const pool = new Pool({
  host: process.env.PGHOST || 'localhost',
  database: process.env.PGDATABASE || 'myapp',
  user: process.env.PGUSER || 'app_user',
  password: process.env.PGPASSWORD,
});

async function main() {
  const user = await pool.query(
    'SELECT * FROM users WHERE id = $1',
    [1]
  );
  console.log(user.rows[0]);

  const products = await pool.query(
    'SELECT * FROM products WHERE attrs @> $1',
    [JSON.stringify({ color: 'red' })]
  );
  console.log(products.rows);
  await pool.end();
}

main().catch((err) => { console.error(err); process.exit(1); });

Документация: