ORM для TypeScript: Сравнение Prisma, TypeORM и MikroORM

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

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

Начать курс

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)
  • Поддержка вложенных сущностей и виртуальных свойств
  • Отличная производительность на сложных запросах

Недостатки:

  • Меньше сообщество и количество ресурсов
  • Более крутая кривая обучения

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