Работа с базами данных в TypeScript: PostgreSQL и MongoDB для начинающих

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

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

Начать курс

Работа с базами данных в TypeScript: PostgreSQL и MongoDB для начинающих

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

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

Перед началом работы убедитесь, что у вас установлены Node.js и npm. Для работы с TypeScript установите компилятор и типы для Node.js:

npm install -g typescript
npm init -y
npm install typescript @types/node --save-dev
npx tsc --init

Для работы с базами данных мы будем использовать популярные библиотеки:

  • TypeORM — ORM для PostgreSQL (и других SQL-БД)
  • Mongoose — ODM для MongoDB

Установите их в свой проект:

npm install typeorm reflect-metadata pg
npm install mongoose

Не забудьте добавить "experimentalDecorators": true и "emitDecoratorMetadata": true в файл tsconfig.json.

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

PostgreSQL — это мощная реляционная СУБД. TypeORM позволяет работать с ней через сущности (entities) и репозитории, что делает код чистым и типизированным.

2.1. Создание соединения и сущности

Создадим файл data-source.ts для настройки подключения:

import { DataSource } from "typeorm";

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

Теперь создадим сущность User в файле src/entity/User.ts:

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

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

    @Column()
    name: string;

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

    @Column()
    age: number;
}

2.2. CRUD-операции с TypeORM

Пример создания и получения пользователей:

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

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

    // Создание
    const newUser = userRepository.create({
        name: "Иван",
        email: "ivan@example.com",
        age: 25
    });
    await userRepository.save(newUser);
    console.log("Пользователь создан:", newUser);

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

    // Обновление
    await userRepository.update({ id: 1 }, { age: 26 });

    // Удаление
    await userRepository.delete({ id: 1 });
}

main().catch(console.error);

TypeORM автоматически генерирует SQL-запросы, а типизация TypeScript защищает от ошибок на этапе компиляции.

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

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

3.1. Подключение и определение схемы

Создадим файл db.ts для подключения:

import mongoose from "mongoose";

export async function connectDB() {
    await mongoose.connect("mongodb://localhost:27017/mydb");
    console.log("Подключено к MongoDB");
}

Определим модель User в файле models/User.ts:

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

export interface IUser extends Document {
    name: string;
    email: string;
    age: number;
}

const userSchema = new Schema({
    name: { type: String, required: true },
    email: { type: String, required: true, unique: true },
    age: { type: Number, required: true }
});

export const UserModel = model("User", userSchema);

3.2. CRUD-операции с Mongoose

Пример работы с данными:

import { connectDB } from "./db";
import { UserModel } from "./models/User";

async function main() {
    await connectDB();

    // Создание
    const user = new UserModel({
        name: "Мария",
        email: "maria@example.com",
        age: 30
    });
    await user.save();
    console.log("Пользователь сохранён:", user);

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

    // Обновление
    await UserModel.updateOne({ email: "maria@example.com" }, { age: 31 });

    // Удаление
    await UserModel.deleteOne({ email: "maria@example.com" });
}

main().catch(console.error);

Mongoose автоматически преобразует данные в BSON и обратно, а TypeScript гарантирует соответствие полей схеме.

4. Сравнение подходов и лучшие практики

Выбор между PostgreSQL и MongoDB зависит от структуры ваших данных:

  • PostgreSQL + TypeORM — идеально для строгих схем, сложных запросов с JOIN и транзакций. Типизация сущностей даёт полный контроль над структурой.
  • MongoDB + Mongoose — подходит для гибких схем, быстрого прототипирования и работы с иерархическими данными (JSON-документы).

Несколько советов для начинающих:

  • Всегда используйте async/await для работы с базой данных, чтобы избежать блокировки потока.
  • Настройте строгие типы для всех полей — это главное преимущество TypeScript.
  • Для PostgreSQL используйте миграции (например, команды TypeORM CLI) вместо synchronize: true в продакшене.
  • Для MongoDB индексируйте часто запрашиваемые поля для повышения производительности.

Заключение

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

Блоги

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