Работа с базами данных в 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-операции