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-запросами.
Сравнительная таблица
Также в библиотеке
Тестирование в Go (Golang): фреймворки и инструменты — полное руководство
PHPMailer для PHP: полное руководство с примерами
Boost.Filesystem для C++: полное руководство с примерами
OAuth клиент для TypeScript: интеграция авторизации в веб-приложениях
Генератор QR-кодов на Java: библиотека ZXing (Zebra Crossing)