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

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

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

Начать курс

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

Современная веб-разработка на JavaScript немыслима без эффективного управления данными. Node.js, как серверная платформа, предоставляет мощные инструменты для взаимодействия с различными системами управления базами данных (СУБД). В этой статье мы подробно рассмотрим работу с двумя популярными решениями — реляционной PostgreSQL и документо-ориентированной MongoDB. Вы узнаете, как подключаться к этим базам данных, выполнять CRUD-операции (создание, чтение, обновление, удаление) и делать осознанный выбор между ними.

Материал будет полезен как начинающим разработчикам, которые только осваивают бэкенд на JavaScript, так и опытным специалистам, желающим систематизировать знания. Все примеры кода написаны для среды выполнения Node.js.

Подготовка окружения и установка драйверов

Прежде чем приступить к работе, необходимо установить соответствующие пакеты через npm. Для PostgreSQL используется драйвер pg, а для MongoDB — официальный драйвер mongodb или популярная ODM-библиотека mongoose.

Создайте новый проект и установите зависимости:

mkdir db-example && cd db-example
npm init -y
npm install pg mongoose

Теперь ваше окружение готово к экспериментам. Убедитесь, что на вашей машине запущены соответствующие серверы баз данных (PostgreSQL на порту 5432 и MongoDB на порту 27017).

1. Работа с PostgreSQL через драйвер pg

PostgreSQL — это мощная реляционная СУБД с поддержкой SQL. Для взаимодействия с ней в Node.js используется пакет pg, который предоставляет как пул соединений, так и отдельного клиента.

Рассмотрим базовый пример подключения и выполнения запросов:

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

// Настройка пула соединений
const pool = new Pool({
  user: 'postgres',
  host: 'localhost',
  database: 'testdb',
  password: 'your_password',
  port: 5432,
});

// Асинхронная функция для работы с БД
async function runPostgresExample() {
  try {
    // Создание таблицы
    await pool.query(`
      CREATE TABLE IF NOT EXISTS users (
        id SERIAL PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        email VARCHAR(100) UNIQUE NOT NULL,
        age INTEGER
      );
    `);

    // INSERT — добавление данных
    const insertResult = await pool.query(
      'INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING *',
      ['Иван Петров', 'ivan@example.com', 30]
    );
    console.log('Добавлен пользователь:', insertResult.rows[0]);

    // SELECT — чтение данных
    const selectResult = await pool.query('SELECT * FROM users');
    console.log('Все пользователи:', selectResult.rows);

    // UPDATE — обновление данных
    await pool.query(
      'UPDATE users SET age = $1 WHERE name = $2',
      [31, 'Иван Петров']
    );
    console.log('Возраст обновлен');

    // DELETE — удаление данных
    await pool.query('DELETE FROM users WHERE name = $1', ['Иван Петров']);
    console.log('Пользователь удален');
  } catch (err) {
    console.error('Ошибка PostgreSQL:', err.message);
  } finally {
    await pool.end();
  }
}

runPostgresExample();

Обратите внимание на использование параметризованных запросов с плейсхолдерами $1, $2 и т.д. Это защищает от SQL-инъекций и является лучшей практикой. Пул соединений рекомендуется для production-среды, так как он эффективно управляет подключениями.

2. Работа с MongoDB через Mongoose

MongoDB — это NoSQL база данных, хранящая данные в формате, похожем на JSON (BSON). Mongoose предоставляет удобную абстракцию с схемами, валидацией и методами для работы с коллекциями.

Пример подключения и CRUD-операций с Mongoose:

const mongoose = require('mongoose');

// Определение схемы пользователя
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);

async function runMongoExample() {
  try {
    // Подключение к MongoDB
    await mongoose.connect('mongodb://localhost:27017/testdb');
    console.log('Подключено к MongoDB');

    // CREATE — создание документа
    const newUser = await User.create({
      name: 'Мария Соколова',
      email: 'maria@example.com',
      age: 28,
    });
    console.log('Создан пользователь:', newUser);

    // READ — чтение документов
    const users = await User.find();
    console.log('Все пользователи:', users);

    // UPDATE — обновление документа
    const updatedUser = await User.findOneAndUpdate(
      { name: 'Мария Соколова' },
      { age: 29 },
      { new: true } // вернуть обновленный документ
    );
    console.log('Обновленный пользователь:', updatedUser);

    // DELETE — удаление документа
    await User.deleteOne({ name: 'Мария Соколова' });
    console.log('Пользователь удален');
  } catch (err) {
    console.error('Ошибка MongoDB:', err.message);
  } finally {
    await mongoose.disconnect();
  }
}

runMongoExample();

Mongoose автоматически преобразует схемы в коллекции (например, модель User создает коллекцию users). Валидация на уровне схемы помогает поддерживать целостность данных без жестких ограничений реляционной модели.

3. Сравнение PostgreSQL и MongoDB: что выбрать?

Выбор между реляционной и документной базой данных зависит от конкретной задачи. Рассмотрим ключевые отличия:

  • Структура данных: PostgreSQL требует заранее определенной схемы с таблицами и связями. MongoDB использует гибкие документы, что упрощает работу с неструктурированными или быстро меняющимися данными.
  • Сложные запросы: SQL предоставляет мощные возможности JOIN, подзапросов и агрегации. MongoDB имеет свой язык запросов (агрегационный пайплайн), но он менее выразителен для сложных реляционных операций.
  • Транзакции и целостность: PostgreSQL поддерживает ACID-транзакции на высоком уровне. MongoDB добавила поддержку многодокументных транзакций, но они менее производительны.
  • Масштабирование: MongoDB изначально спроектирована для горизонтального масштабирования (шардинга). PostgreSQL традиционно масштабируется вертикально, хотя существуют решения для репликации.
  • Экосистема Node.js:

Блоги

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