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 |
|---|---|---|---|
Т
Также в библиотекеРекомендаций |