Работа с базами данных в JavaScript: PostgreSQL и MongoDB

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в работу с базами данных в 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?

  • Гибкая схема: Данные с разной структурой (например, логи, пользовательские настройки).
  • Быстрый прототип: Не нужно заранее проектировать таблицы и миграции

Блоги

Рекомендаций по книгам