ORM для TypeScript: Сравнение и примеры использования
В современной TypeScript-разработке выбор правильного ORM (Object-Relational Mapping) — это фундаментальное решение, влияющее на производительность, читаемость кода и скорость разработки. В этой статье мы подробно сравним три самых популярных ORM для TypeScript: Prisma, TypeORM и MikroORM. Вы узнаете их сильные и слабые стороны, увидите примеры кода и получите практические рекомендации для вашего проекта.
1. Prisma — современный стандарт
Prisma — это ORM нового поколения, который использует собственный декларативный язык схем. Он автоматически генерирует типобезопасный клиент на основе вашей схемы базы данных. Prisma поддерживает PostgreSQL, MySQL, SQLite, SQL Server и MongoDB.
Преимущества:
- Мощная система типов — все запросы проверяются на этапе компиляции
- Встроенные миграции и визуальный редактор Prisma Studio
- Превосходная документация и активное сообщество
- Автокомплит в IDE
Недостатки:
- Дополнительный шаг генерации клиента
- Меньше гибкости для сложных SQL-запросов
- Относительно большой размер пакета
Пример кода:
// schema.prisma
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
authorId Int
author User @relation(fields: [authorId], references: [id])
}
// app.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
// Создание пользователя с постом
const user = await prisma.user.create({
data: {
email: 'alice@example.com',
name: 'Alice',
posts: {
create: { title: 'Hello World' }
}
},
include: { posts: true }
});
// Поиск с фильтрацией
const users = await prisma.user.findMany({
where: { email: { contains: 'alice' } },
orderBy: { name: 'asc' }
});
console.log(users);
}
main();
2. TypeORM — проверенный ветеран
TypeORM — один из старейших ORM для TypeScript, вдохновлённый Hibernate и Entity Framework. Использует декораторы для определения сущностей и поддерживает Active Record и Data Mapper паттерны. Работает с большинством реляционных баз данных.
Преимущества:
- Гибкая система декораторов
- Поддержка миграций и синхронизации схем
- Большое количество интеграций и расширений
- Зрелый и проверенный временем проект
Недостатки:
- Менее строгая типизация по сравнению с Prisma
- Сложная конфигурация для новичков
- Медленное развитие в последнее время
Пример кода:
// entity/User.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';
import { Post } from './Post';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ unique: true })
email: string;
@Column({ nullable: true })
name: string;
@OneToMany(() => Post, (post) => post.author)
posts: Post[];
}
// app.ts
import { createConnection } from 'typeorm';
import { User } from './entity/User';
async function main() {
const connection = await createConnection();
const userRepo = connection.getRepository(User);
// Создание
const user = userRepo.create({
email: 'bob@example.com',
name: 'Bob'
});
await userRepo.save(user);
// Поиск
const users = await userRepo.find({
where: { name: Like('%Bob%') },
relations: ['posts']
});
console.log(users);
}
main();
3. MikroORM — производительность и гибкость
MikroORM — это TypeScript ORM, основанный на паттерне Data Mapper. Он известен своей высокой производительностью, поддержкой Identity Map и встроенной поддержкой транзакций. Работает с SQLite, PostgreSQL, MySQL, MariaDB и MongoDB.
Преимущества:
- Продвинутая система кэширования (Identity Map)
- Автоматическое обнаружение изменений (Change Tracking)
- Поддержка вложенных сущностей и виртуальных свойств
- Отличная производительность на сложных запросах
Недостатки:
- Меньше сообщество и количество ресурсов
- Более крутая кривая обучения