ORM для TypeScript: сравнение и примеры
В современной веб-разработке на TypeScript выбор правильного ORM (Object-Relational Mapping) — одно из ключевых решений, влияющее на архитектуру, производительность и удобство поддержки проекта. ORM позволяет работать с базой данных через объекты языка программирования, абстрагируя SQL-запросы. В этой статье мы рассмотрим три наиболее популярные ORM для TypeScript: TypeORM, Prisma и MikroORM. Вы узнаете их сильные и слабые стороны, а также увидите примеры кода для каждой из них.
1. TypeORM
TypeORM — одна из старейших и наиболее зрелых ORM для TypeScript и JavaScript. Она поддерживает Active Record и Data Mapper паттерны, а также множество баз данных: PostgreSQL, MySQL, SQLite, MongoDB и другие.
Особенности TypeORM:
- Поддержка декораторов для определения сущностей
- Гибкие отношения: OneToOne, OneToMany, ManyToMany
- Миграции и синхронизация схемы
- Поддержка подписок и событий жизненного цикла
- Query Builder для сложных запросов
Пример кода с TypeORM:
import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, createConnection } from "typeorm";
@Entity()
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
}
async function main() {
await createConnection({
type: "postgres",
host: "localhost",
port: 5432,
username: "test",
password: "test",
database: "test",
entities: [User],
synchronize: true,
});
const user = new User();
user.name = "Иван";
user.email = "ivan@example.com";
await user.save();
const users = await User.find();
console.log(users);
}
Плюсы: большое сообщество, множество туториалов, поддержка MongoDB. Минусы: сложная конфигурация, проблемы с lazy loading, иногда неинтуитивный API.
2. Prisma
Prisma — современная ORM, которая переосмысливает подход к работе с базой данных. Вместо традиционного ORM она предлагает три компонента: Prisma Client (автоматически сгенерированный типобезопасный клиент), Prisma Migrate (система миграций) и Prisma Studio (графический интерфейс).
Особенности Prisma:
- Декларативная схема данных (schema.prisma)
- Полная типизация на основе схемы — никаких ручных типов
- Автоматическая генерация клиента
- Поддержка транзакций и пагинации
- Интеграция с GraphQL (Nexus, TypeGraphQL)
Пример кода с Prisma:
// schema.prisma
model User {
id Int @id @default(autoincrement())
name String
email String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
authorId Int
author User @relation(fields: [authorId], references: [id])
}
// main.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
const user = await prisma.user.create({
data: {
name: 'Мария',
email: 'maria@example.com',
posts: {
create: { title: 'Мой первый пост' }
}
},
include: { posts: true }
});
const users = await prisma.user.findMany({
include: { posts: true }
});
console.log(users);
}
main()
.catch(e => console.error(e))
.finally(() => prisma.$disconnect());
Плюсы: лучшая в классе типизация, простой синтаксис, отличная документация. Минусы: привязанность к схеме, сложность с кастомными запросами, большее потребление памяти.
3. MikroORM
MikroORM — это микро-ORM, вдохновлённая Doctrine (PHP) и Hibernate (Java). Она фокусируется на производительности и минимализме, поддерживая как SQL, так и MongoDB.
Особенности MikroORM:
- Полная поддержка Identity Map и Unit of Work
- Автоматическое обнаружение изменений (dirty checking)
- Поддержка вложенных сущностей (embedded entities)
- Query Builder для сложных запросов
- Встроенная поддержка кэширования
Пример кода с MikroORM:
import { Entity, PrimaryKey, Property, MikroORM } from '@mikro-orm/core';
import { PostgreSqlDriver } from '@mikro-orm/postgresql';
@Entity