PostgreSQL: Node.js (pg) — Pool, параметризованные запросы, JSONB
Подключение к PostgreSQL из Node.js через пакет pg: Pool, query с $1 $2, запросы по JSONB. Копируй — вставляй — работает. По документации node-postgres.
Как использовать
- Установи: npm i pg. Для TypeScript: npm i -D @types/pg.
- Подставь свои host, database, user, password (лучше из process.env).
- Всегда используй параметры $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); });
Документация: