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

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

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

Начать курс

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

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

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

Прежде чем писать код, необходимо настроить проект. Создайте новую директорию и инициализируйте проект:

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

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

npm install typeorm reflect-metadata pg
npm install mongoose

Также установим типы для Node.js и настройки для TypeORM:

npm install @types/node --save-dev

В файле tsconfig.json обязательно включите опции:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

Теперь структура проекта готова. Создайте папку src и внутри неё файлы для работы с каждой БД.

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

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

TypeORM позволяет работать с БД через декораторы и сущности. Создадим файл src/postgres.ts и настроим подключение к локальной PostgreSQL базе данных ts_db:

import "reflect-metadata";
import { DataSource } from "typeorm";

export const AppDataSource = new DataSource({
  type: "postgres",
  host: "localhost",
  port: 5432,
  username: "postgres",
  password: "password",
  database: "ts_db",
  synchronize: true, // автоматически создаёт таблицы (только для разработки)
  logging: false,
  entities: ["src/entity/**/*.ts"],
});

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

Сущность — это класс, который маппится на таблицу в БД. Создадим папку src/entity и файл User.ts:

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

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

  @Column({ length: 100 })
  name: string;

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

  @Column({ default: 18 })
  age: number;
}

Выполнение CRUD-операций

Теперь напишем функции для создания, чтения, обновления и удаления пользователей в файле src/postgres-crud.ts:

import { AppDataSource } from "./postgres";
import { User } from "./entity/User";

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

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

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

  // UPDATE — обновление возраста пользователя с id=1
  const userToUpdate = await userRepository.findOneBy({ id: 1 });
  if (userToUpdate) {
    userToUpdate.age = 30;
    await userRepository.save(userToUpdate);
    console.log("Пользователь обновлён:", userToUpdate);
  }

  // DELETE — удаление пользователя с id=1
  await userRepository.delete(1);
  console.log("Пользователь удалён");
}

main().catch(err => console.error(err));

Запустите скрипт командой npx ts-node src/postgres-crud.ts. TypeORM автоматически создаст таблицу user и выполнит все операции.

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

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

Mongoose предоставляет удобный API для работы с MongoDB. Создадим файл src/mongodb.ts:

import mongoose from "mongoose";

const MONGODB_URI = "mongodb://localhost:27017/ts_mongo_db";

export async function connectToMongo() {
  try {
    await mongoose.connect(MONGODB_URI);
    console.log("Подключено к MongoDB");
  } catch (error) {
    console.error("Ошибка подключения:", error);
    process.exit(1);
  }
}

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

В MongoDB данные хранятся в виде документов. Создадим модель пользователя в файле src/models/User.ts:

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

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

// Схема Mongoose
const UserSchema: Schema = new Schema({
  name: { type: String, required: true },
  email: { type: String, required: true, unique: true },
  age: { type: Number, default: 18 },
  createdAt: { type: Date, default: Date.now },
});

export const UserModel = mongoose.model<IUser>("User", UserSchema);

Выполнение CRUD-операций

Теперь напишем скрипт для работы с MongoDB в файле src/mongodb-crud.ts:

import { connectToMongo } from "./mongodb";
import { UserModel } from "./models/User";

async function main() {
  await connectToMongo();

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

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

  // UPDATE — обновление возраста по email
  const updatedUser = await UserModel.findOneAndUpdate(
    { email: "maria@example.com" },                

Блоги

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