Введение в работу с базами данных в 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-приложения. Удачи в разработке!