ORM для TypeScript: Сравнение Prisma, TypeORM и Drizzle — примеры кода

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

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

Начать курс

ORM для TypeScript: сравнение и примеры

В современной веб-разработке на TypeScript выбор правильного ORM (Object-Relational Mapping) может значительно ускорить разработку и повысить надежность приложения. ORM позволяет работать с базами данных через объектно-ориентированный подход, избегая написания сырых SQL-запросов. В этой статье мы сравним три самых популярных ORM для TypeScript: Prisma, TypeORM и Drizzle, а также рассмотрим примеры их использования.

1. Prisma — современный стандарт

Prisma — это ORM нового поколения, который фокусируется на удобстве разработчика и производительности. Он использует собственный язык описания схемы (Prisma Schema) и генерирует полностью типизированный клиент.

Ключевые особенности:

  • Автоматическая генерация типов TypeScript
  • Интуитивно понятный API для запросов
  • Встроенная миграция данных (Prisma Migrate)
  • Поддержка PostgreSQL, MySQL, SQLite, MongoDB и других

Пример кода на TypeScript:

// 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])
}

// Использование в коде
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function getUsersWithPosts() {
  const users = await prisma.user.findMany({
    include: { posts: true }
  });
  return users;
}

2. TypeORM — классика для TypeScript

TypeORM — это зрелый ORM, который поддерживает как Active Record, так и Data Mapper паттерны. Он тесно интегрирован с TypeScript и использует декораторы для определения моделей.

Ключевые особенности:

  • Поддержка декораторов и классов
  • Два подхода: Active Record и Data Mapper
  • Расширенная миграция и подписки на события
  • Поддержка множества СУБД

Пример кода на TypeScript:

import { Entity, PrimaryGeneratedColumn, Column, OneToMany, createConnection } from "typeorm";

@Entity()
export class User {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    name: string;

    @Column({ unique: true })
    email: string;

    @OneToMany(() => Post, post => post.user)
    posts: Post[];
}

@Entity()
export class Post {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    title: string;

    @Column({ nullable: true })
    content: string;

    @ManyToOne(() => User, user => user.posts)
    user: User;
}

// Использование
async function getUsersWithPosts() {
    const connection = await createConnection();
    const userRepository = connection.getRepository(User);
    return await userRepository.find({ relations: ["posts"] });
}

3. Drizzle — легковесный и производительный

Drizzle — это относительно новый ORM, который делает упор на производительность и минимальный размер бандла. Он использует SQL-подобный синтаксис и не требует генерации кода.

Ключевые особенности:

  • Минимальный размер и высокая скорость
  • Нативная поддержка TypeScript без декораторов
  • SQL-подобный API (query builder)
  • Совместимость с базами данных SQL

Пример кода на TypeScript:

import { drizzle } from 'drizzle-orm/better-sqlite3';
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
import Database from 'better-sqlite3';

const sqlite = new Database('test.db');
const db = drizzle(sqlite);

// Определение схемы
const users = sqliteTable('users', {
    id: integer('id').primaryKey(),
    name: text('name'),
    email: text('email').unique(),
});

const posts = sqliteTable('posts', {
    id: integer('id').primaryKey(),
    title: text('title'),
    content: text('content'),
    authorId: integer('author_id').references(() => users.id),
});

// Использование
async function getUsersWithPosts() {
    const result = await db.select()
        .from(users)
        .leftJoin(posts, eq(users.id, posts.authorId))
        .all();
    return result;
}

Сравнительная таблица

Чтобы помочь вам сделать выбор, мы подготовили краткое сравнение:

Характеристика Prisma TypeORM Drizzle
Т

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