Введение в работу с базами данных в JavaScript
Современная веб-разработка на JavaScript немыслима без взаимодействия с базами данных. Node.js предоставляет мощные инструменты для работы как с реляционными (SQL), так и с документо-ориентированными (NoSQL) базами данных. В этой статье мы подробно разберем подключение и выполнение основных операций с двумя самыми популярными СУБД в экосистеме JavaScript: PostgreSQL и MongoDB.
Вы узнаете, как установить драйверы, настроить подключение, выполнять CRUD-операции (Create, Read, Update, Delete) и делать правильный выбор между SQL и NoSQL для вашего проекта.
Подготовка окружения
Для работы с примерами вам понадобится установленный Node.js (версия 18+) и менеджер пакетов npm. Убедитесь, что базы данных запущены локально или доступны удаленно.
1. Работа с PostgreSQL в Node.js
PostgreSQL — это мощная реляционная база данных с открытым исходным кодом. Для работы с ней в Node.js мы будем использовать библиотеку pg — официальный клиент.
Установка и подключение
npm install pg
Создадим файл db.js для настройки пула соединений:
const { Pool } = require('pg');
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'mydb',
password: 'secret',
port: 5432,
});
module.exports = pool;
CRUD операции с PostgreSQL
Рассмотрим базовые запросы к таблице users:
Создание таблицы (CREATE)
const createTable = async () => {
const query = `
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
age INTEGER,
created_at TIMESTAMP DEFAULT NOW()
);
`;
await pool.query(query);
console.log('Таблица users создана');
};
Вставка данных (INSERT)
const addUser = async (name, email, age) => {
const text = 'INSERT INTO users(name, email, age) VALUES($1, $2, $3) RETURNING *';
const values = [name, email, age];
const res = await pool.query(text, values);
console.log('Добавлен пользователь:', res.rows[0]);
return res.rows[0];
};
// Использование
addUser('Иван Петров', 'ivan@example.com', 30);
Чтение данных (SELECT)
const getUsers = async (ageLimit) => {
const res = await pool.query(
'SELECT * FROM users WHERE age > $1 ORDER BY created_at DESC',
[ageLimit]
);
return res.rows;
};
// Получить пользователей старше 25 лет
getUsers(25).then(users => console.log(users));
Обновление и удаление (UPDATE / DELETE)
const updateUser = async (id, newName) => {
const res = await pool.query(
'UPDATE users SET name = $1 WHERE id = $2 RETURNING *',
[newName, id]
);
return res.rows[0];
};
const deleteUser = async (id) => {
await pool.query('DELETE FROM users WHERE id = $1', [id]);
console.log(`Пользователь с id ${id} удален`);
};
Важно: Всегда используйте параметризованные запросы ($1, $2) для предотвращения SQL-инъекций.
2. Работа с MongoDB в Node.js
MongoDB — самая популярная NoSQL база данных, хранящая данные в формате JSON-подобных документов. Для работы используем официальный драйвер mongodb или популярную ODM-библиотеку mongoose.
Установка и подключение (с использованием mongoose)
npm install mongoose
const mongoose = require('mongoose');
const connectDB = async () => {
try {
await mongoose.connect('mongodb://localhost:27017/mydb');
console.log('MongoDB подключена');
} catch (error) {
console.error('Ошибка подключения:', error);
}
};
connectDB();
Определение схемы и модели
const userSchema = new mongoose.Schema({
name: { type: String, required: true },
email: { type: String, required: true, unique: true },
age: { type: Number, min: 0 },
createdAt: { type: Date, default: Date.now }
});
const User = mongoose.model('User', userSchema);
CRUD операции с MongoDB
Создание документа
const createUser = async (userData) => {
const user = new User(userData);
const savedUser = await user.save();
console.log('Создан пользователь:', savedUser);
return savedUser;
};
createUser({ name: 'Анна Смирнова', email: 'anna@example.com', age: 28 });
Чтение документов
const findUsers = async (minAge) => {
const users = await User.find({ age: { $gt: minAge } })
.sort({ createdAt: -1 })
.select('name email age');
return users;
};
findUsers(25).then(users => console.log(users));
Обновление и удаление
const updateUser = async (id, updates) => {
const user = await User.findByIdAndUpdate(id, updates, { new: true });
return user;
};
const deleteUser = async (id) => {
await User.findByIdAndDelete(id);
console.log('Пользователь удален');
};
3. Сравнение PostgreSQL и MongoDB для Node.js проектов
Выбор между реляционной и документной базой данных — ключевое архитектурное решение. Рассмотрим основные критерии:
Когда выбирать PostgreSQL?
- Сложные связи данных: Если у вас много связанных сущностей (заказы, товары, клиенты) — SQL справляется лучше.
- Транзакции и целостность: ACID-совместимость PostgreSQL критична для финансовых и банковских систем.
- Сложные запросы: JOIN, подзапросы, оконные функции — это сила реляционных БД.
- Строгая структура: Если схема данных редко меняется и известна заранее.
Когда выбирать MongoDB?
- Гибкая схема: Данные с разной структурой (например, логи, пользовательские настройки).
- Быстрый прототип: Не нужно заранее проектировать таблицы и миграции