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 connection.manager.save(user);
console.log("Пользователь сохранён:", user);
}
main().catch(console.error);
3. Prisma
Prisma — относительно новый, но уже очень популярный инструмент, который позиционируется как "следующее поколение ORM". Вместо классических моделей, Prisma использует собственный язык схемы (Prisma Schema) и генерирует полностью типизированный клиент. Он поддерживает PostgreSQL, MySQL, SQLite, SQL Server и MongoDB.
Основные особенности:
- Автоматическая генерация типового клиента (отличная интеграция с TypeScript).
- Декларативная схема данных (файл schema.prisma).
-
Также в библиотеке
Рекомендаций