Какие ORM для Node.js ты знаешь и использовал?

«Какие ORM для Node.js ты знаешь и использовал?» — вопрос из категории ORM, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В экосистеме Node.js я работал с несколькими ORM и ODM, выбор зависит от типа БД и стека проекта.

Для реляционных БД (PostgreSQL, MySQL, SQLite):

  1. Prisma — моя основная ORM для новых проектов. Она не является классической ORM, а скорее query builder с автоматической генерацией типов на основе схемы. Это даёт полную type-safe работу с БД прямо в TypeScript.

    // Схема в schema.prisma
    model User {
      id    Int     @id @default(autoincrement())
      email String  @unique
      name  String?
    }
    
    // Использование в коде
    const newUser = await prisma.user.create({
      data: { email: 'alex@example.com', name: 'Alex' },
    });
    // `newUser` имеет тип `User`, сгенерированный Prisma
  2. Sequelize — зрелая, многофункциональная ORM. Использовал её в legacy-проектах. Поддерживает множество диалектов SQL, но типизация в TypeScript может быть громоздкой.

    const User = sequelize.define('User', { name: DataTypes.STRING });
    const user = await User.findOne({ where: { id: 1 } });
  3. TypeORM — ORM, вдохновленная Hibernate и .NET Entity Framework. Мощная, но сложная. Хорошо подходит для больших enterprise-проектов с активным использованием декораторов.

    @Entity()
    export class User {
        @PrimaryGeneratedColumn() id: number;
        @Column() name: string;
    }
    const userRepo = connection.getRepository(User);
    await userRepo.save({ name: 'Alex' });

Для MongoDB:

  1. Mongoose (ODM) — де-факто стандарт для работы с MongoDB в Node.js. Предоставляет схему, валидацию, хуки и популяцию связей.
    const userSchema = new mongoose.Schema({ name: String, age: Number });
    const User = mongoose.model('User', userSchema);
    await User.create({ name: 'Alex', age: 30 });

Query Builder:

  1. Knex.js — не ORM, а мощный конструктор SQL-запросов. Часто используется в связке с Objection.js (легковесная ORM поверх Knex) или напрямую, когда нужен полный контроль над SQL.
    await knex('users').where('age', '>', 18).select('name');

Мой стек: Для новых проектов на TypeScript с PostgreSQL я выбираю Prisma из-за её безопасности типов и отличного DX. Для проектов на MongoDB — Mongoose. В микросервисах, где запросы простые, иногда обхожусь Knex.