ORM для JavaScript (Node.js): сравнение Sequelize, TypeORM, Prisma

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

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

Начать курс

ORM для JavaScript (Node.js): сравнение и примеры

При разработке серверной части на Node.js рано или поздно встаёт вопрос взаимодействия с базой данных. Написание чистых SQL-запросов — задача трудоёмкая и подверженная ошибкам. На помощь приходят ORM (Object-Relational Mapping) — библиотеки, которые позволяют работать с таблицами баз данных как с обычными объектами JavaScript. В этой статье мы сравним три самых популярных ORM для Node.js: Sequelize, TypeORM и Prisma, и приведём наглядные примеры кода.

1. Sequelize

Sequelize — один из старейших и наиболее зрелых ORM для Node.js. Он поддерживает PostgreSQL, MySQL, MariaDB, SQLite и Microsoft SQL Server. Sequelize использует классический подход с моделями и промисами (или async/await).

Установка

npm install sequelize pg pg-hstore

Пример: определение модели и запрос

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'user', 'password', {
  host: 'localhost',
  dialect: 'postgres'
});

const User = sequelize.define('User', {
  name: { type: DataTypes.STRING, allowNull: false },
  email: { type: DataTypes.STRING, unique: true }
});

async function createUser() {
  await sequelize.sync();
  const user = await User.create({ name: 'Иван', email: 'ivan@example.com' });
  console.log(user.toJSON());
}
createUser();

Особенности Sequelize

  • Зрелость и большое сообщество.
  • Поддержка транзакций, миграций и seed-данных.
  • Гибкая система ассоциаций (hasOne, hasMany, belongsToMany).
  • Недостаток: местами громоздкий синтаксис и сложная отладка.

2. TypeORM

TypeORM — это ORM, которая может работать как с JavaScript, так и с TypeScript. Она поддерживает те же СУБД, что и Sequelize, и предлагает два подхода: Active Record и Data Mapper. TypeORM также активно использует декораторы, что делает код более декларативным.

Установка

npm install typeorm reflect-metadata pg

Пример: модель с декоратором и запрос

import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';

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

  @Column()
  name: string;

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

async function createUser() {
  const connection = await createConnection({
    type: 'postgres',
    host: 'localhost',
    database: 'test',
    entities: [User],
    synchronize: true
  });
  const user = new User();
  user.name = 'Мария';
  user.email = 'maria@example.com';
  await connection.manager.save(user);
  console.log(user);
}
createUser();

Особенности TypeORM

  • Отличная интеграция с TypeScript и декораторами.
  • Гибкость: выбор между Active Record и Data Mapper.
  • Поддержка миграций, подписчиков событий и логгирования.
  • Недостаток: документация местами неполная, частые breaking changes.

3. Prisma

Prisma — современный ORM, который кардинально отличается от предшественников. Вместо моделей в коде вы описываете схему данных в специальном файле schema.prisma, а Prisma генерирует типобезопасный клиент. Это обеспечивает автодополнение в IDE и минимум ошибок.

Установка

npm install @prisma/client
npx prisma init

Пример: схема и запрос

schema.prisma:

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id    Int     @id @default(autoincrement())
  name  String
  email String  @unique
}

Код JavaScript:

const { PrismaClient } = require('@prisma/client');
const prisma = new PrismaClient();

async function createUser() {
  const user = await prisma.user.create({
    data: { name: 'Алексей', email: 'alex@example.com' }
  });
  console.log(user);
}
createUser();

Особенности Prisma

  • Максимальная типобезопасность и автодополнение.
  • Интуитивно понятный синтаксис запросов.
  • Встроенные миграции и визуальный редактор Prisma Studio.
  • Недостаток: менее гибкая работа с сырыми SQL-запросами.

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

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