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

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

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

Начать курс

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                    

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