ORM для JavaScript (Node.js): сравнение и примеры
В современной веб-разработке на Node.js взаимодействие с базами данных (БД) — одна из ключевых задач. Использование чистого SQL-кода может быть эффективным, но часто приводит к дублированию, ошибкам и сложностям с поддержкой. Здесь на помощь приходят ORM (Object-Relational Mapping) — инструменты, которые позволяют работать с таблицами БД как с обычными объектами JavaScript. В этой статье мы рассмотрим три самых популярных ORM для Node.js: Sequelize, TypeORM и Prisma, сравним их особенности и приведём практические примеры.
Что такое ORM и зачем он нужен?
ORM (Object-Relational Mapping) — это технология, которая связывает реляционные базы данных с объектно-ориентированным языком программирования. Вместо написания SQL-запросов, вы манипулируете объектами и их методами. Это даёт несколько преимуществ:
- Абстракция от БД: Вы можете легко переключаться между PostgreSQL, MySQL, SQLite без изменения бизнес-логики.
- Безопасность: ORM автоматически экранирует данные, защищая от SQL-инъекций.
- Удобство: Меньше шаблонного кода, автоматические миграции, валидация данных.
- Поддержка связей: Простое определение отношений (один-к-одному, один-ко-многим, многие-ко-многим).
1. Sequelize
Sequelize — один из старейших и наиболее зрелых ORM для Node.js. Он поддерживает PostgreSQL, MySQL, MariaDB, SQLite и Microsoft SQL Server. Sequelize использует объектно-ориентированный подход и основан на промисах.
Основные особенности:
- Гибкая система миграций и сидеров (заполнение тестовыми данными).
- Поддержка транзакций, raw-запросов и хуков (жизненный цикл модели).
- Большое сообщество и множество готовых решений.
Пример кода (Node.js):
const { Sequelize, DataTypes } = require('sequelize');
// Подключение к БДconst sequelize = new Sequelize('database', 'username', '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().catch(console.error);2. TypeORM
TypeORM — это ORM, созданный с упором на TypeScript, но также работающий и с чистым JavaScript. Он поддерживает те же базы данных, что и Sequelize, плюс MongoDB (через экспериментальный режим). TypeORM использует декораторы (для TypeScript) и активный подход к записи (Active Record) или Data Mapper.
Основные особенности:
- Полная поддержка TypeScript с автодополнением и проверкой типов.
- Два паттерна: Active Record (методы на модели) и Data Mapper (репозитории).
- Автоматические миграции на основе изменений сущностей.
Пример кода (Node.js + TypeScript):
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
// Использованиеasync function main() { 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
```