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

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

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

Начать курс

Введение в работу с базами данных в TypeScript

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

Настройка окружения и установка зависимостей

Перед началом работы убедитесь, что у вас установлены Node.js и npm. Создайте новый проект и установите необходимые пакеты:

mkdir typescript-db-example
cd typescript-db-example
npm init -y
npm install typescript ts-node @types/node --save-dev
npx tsc --init

Для работы с PostgreSQL будем использовать TypeORM — мощный ORM с поддержкой TypeScript. Для MongoDB — Mongoose.

npm install typeorm reflect-metadata pg
npm install mongoose

Работа с PostgreSQL через TypeORM

Настройка подключения к PostgreSQL

TypeORM поддерживает декораторы и активную запись. Создадим файл data-source.ts для конфигурации:

import { DataSource } from "typeorm";

export const AppDataSource = new DataSource({
    type: "postgres",
    host: "localhost",
    port: 5432,
    username: "your_username",
    password: "your_password",
    database: "test_db",
    synchronize: true,
    logging: false,
    entities: ["src/entity/**/*.ts"],
    migrations: [],
    subscribers: [],
});

Создание сущности (Entity)

Определим модель пользователя с помощью декораторов:

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column({ unique: true })
    email: string;

    @Column({ default: true })
    isActive: boolean;
}

CRUD-операции с PostgreSQL

Выполним основные операции с базой данных:

import { AppDataSource } from "./data-source";
import { User } from "./entity/User";

async function main() {
    await AppDataSource.initialize();
    const userRepository = AppDataSource.getRepository(User);

    // CREATE
    const newUser = userRepository.create({
        firstName: "Иван",
        lastName: "Петров",
        email: "ivan@example.com"
    });
    await userRepository.save(newUser);

    // READ
    const users = await userRepository.find();
    console.log("Все пользователи:", users);

    // UPDATE
    const userToUpdate = await userRepository.findOneBy({ id: 1 });
    if (userToUpdate) {
        userToUpdate.isActive = false;
        await userRepository.save(userToUpdate);
    }

    // DELETE
    await userRepository.delete({ id: 1 });
}

main().catch(console.error);

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

Подключение к MongoDB

Mongoose предоставляет удобную схему и валидацию для MongoDB. Настроим подключение:

import mongoose, { Schema, Document, Model } from "mongoose";

const MONGO_URI = "mongodb://localhost:27017/test";

mongoose.connect(MONGO_URI)
    .then(() => console.log("Подключено к MongoDB"))
    .catch(err => console.error("Ошибка подключения:", err));

Определение схемы и модели

Создадим интерфейс для TypeScript и схему Mongoose:

// Интерфейс для TypeScript
interface IUser extends Document {
    firstName: string;
    lastName: string;
    email: string;
    createdAt: Date;
}

// Схема Mongoose
const userSchema = new Schema({
    firstName: { type: String, required: true },
    lastName: { type: String, required: true },
    email: { type: String, required: true, unique: true },
    createdAt: { type: Date, default: Date.now }
});

// Модель
const UserModel: Model = mongoose.model("User", userSchema);

CRUD-операции с MongoDB

Реализуем те же операции, что и для PostgreSQL:

async function mongoCRUD() {
    // CREATE
    const newUser = new UserModel({
        firstName: "Мария",
        lastName: "Сидорова",
        email: "maria@example.com"
    });
    await newUser.save();

    // READ
    const allUsers = await UserModel.find();
    console.log("Все пользователи:", allUsers);

    // UPDATE
    await UserModel.updateOne(
        { email: "maria@example.com" },
        { lastName: "Иванова" }
    );

    // DELETE
    await UserModel.deleteOne({ email: "maria@example.com" });
}

mongoCRUD();

Сравнение PostgreSQL и MongoDB в TypeScript

Когда выбирать PostgreSQL?

  • Требуется строгая структура данных и ACID-транзакции
  • Сложные запросы с JOIN и агрегациями
  • Работа с финансовыми или критически важными данными
  • Необходимость в миграциях и реляционных связях

Когда выбирать MongoDB?

  • Гибкая схема данных (быстрое прототипирование)
  • Большие объемы данных с высокой скоростью записи
  • Документо-ориентированная модель (JSON-подобные структуры)
  • Горизонтальное масштабирование (шардирование)

TypeScript-специфичные преимущества

TypeScript добавляет безопасность типов в обе базы данных. С TypeORM вы получаете автогенерацию типов на основе сущностей, а с Mongoose — строгую валидацию через интерфейсы. Это значительно снижает количество ошибок времени выполнения.

Заключение

В этой статье мы рассмотрели основы работы с PostgreSQL и MongoDB в TypeScript. TypeORM и Mongoose предоставляют мощные инструменты для взаимодействия с базами данных, а TypeScript добавляет надежность и удобство разработки. Выбор между реляционной и NoSQL базой зависит от конкретных требований проекта. Рекомендуем начать с PostgreSQL, если нужна строгая структура, и с MongoDB — для гибких и быстрорастущих проектов.

Практикуйтесь с примерами кода, и вы быстро освоите интеграцию баз данных в свои TypeScript-приложения. Удачи в разработке!

Блоги

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