1. Что такое Sequelize и зачем он нужен
Sequelize — это мощная ORM (Object-Relational Mapping) библиотека для Node.js, которая поддерживает работу с реляционными базами данных: PostgreSQL, MySQL, MariaDB, SQLite и Microsoft SQL Server. ORM позволяет разработчикам взаимодействовать с базой данных, используя объектно-ориентированный подход вместо написания чистых SQL-запросов.
Основные преимущества использования Sequelize:
- Абстракция SQL — работа с таблицами через JavaScript-объекты и методы
- Безопасность — автоматическая защита от SQL-инъекций
- Миграции — управление изменениями схемы базы данных
- Отношения — простая реализация связей между таблицами (1:1, 1:M, M:N)
- Валидация — встроенные механизмы проверки данных
- Транзакции — поддержка атомарных операций
Sequelize идеально подходит для создания REST API, веб-приложений на Express.js, ботов и любых проектов, где требуется надежная работа с SQL-базами данных.
2. Установка
Установка Sequelize и драйвера для вашей базы данных выполняется через npm:
// Базовый пакет
npm install sequelize
// Драйвер для PostgreSQL
npm install pg pg-hstore
// Драйвер для MySQL
npm install mysql2
// Драйвер для SQLite
npm install sqlite3
// Драйвер для MSSQL
npm install tedious
Для быстрого старта с SQLite (не требует установки сервера):
npm install sequelize sqlite3
3. Быстрый старт с примером кода
Создадим простое приложение для управления пользователями:
// index.js
const { Sequelize, DataTypes, Model } = require('sequelize');
// 1. Подключение к базе данных (SQLite)
const sequelize = new Sequelize({
dialect: 'sqlite',
storage: './database.sqlite',
logging: false // отключаем логи SQL-запросов
});
// 2. Определение модели User
class User extends Model {}
User.init({
id: {
type: DataTypes.INTEGER,
autoIncrement: true,
primaryKey: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true
}
},
age: {
type: DataTypes.INTEGER,
validate: {
min: 0,
max: 150
}
}
}, {
sequelize,
modelName: 'User',
timestamps: true // добавляет createdAt и updatedAt
});
// 3. Синхронизация с БД и тестовые операции
async function main() {
await sequelize.sync({ force: true }); // создает таблицу заново
console.log('Таблица User создана');
// Создание пользователя
const user = await User.create({
name: 'Иван Петров',
email: 'ivan@example.com',
age: 30
});
console.log('Создан пользователь:', user.toJSON());
// Поиск всех пользователей
const users = await User.findAll();
console.log('Все пользователи:', JSON.stringify(users, null, 2));
// Поиск по ID
const foundUser = await User.findByPk(1);
console.log('Найден пользователь:', foundUser.name);
// Обновление
await User.update({ age: 31 }, { where: { id: 1 } });
console.log('Возраст обновлен');
// Удаление
await User.destroy({ where: { id: 1 } });
console.log('Пользователь удален');
}
main().catch(console.error);
4. Основные методы и функции
4.1. Sequelize.define() / Model.init()
Описание: Определение модели (таблицы) с указанием полей и их типов.
Параметры:
modelName— имя моделиattributes— объект с определением полейoptions— настройки модели (tableName, timestamps, indexes и др.)
Пример:
const Product = sequelize.define('Product', {
title: {
type: DataTypes.STRING,
allowNull: false
},
price: {
type: DataTypes.DECIMAL(10, 2),
defaultValue: 0.00
},
inStock: {
type: DataTypes.BOOLEAN,
defaultValue: true
}
}, {
tableName: 'products',
timestamps: false
});
4.2. Model.create()
Описание: Создает новую запись в таблице и возвращает созданный объект.
Параметры:
values— объект с данными для вставкиoptions— опции (fields, returning, transaction и др.)
Пример:
const newProduct = await Product.create({
title: 'Ноутбук',
price: 59999.99,
inStock: true
});
console.log(newProduct.id); // 1
4.3. Model.findAll()
Описание: Поиск всех записей, удовлетворяющих условиям. Возвращает массив объектов.
Параметры:
options— объект с условиями (where, include, order, limit, offset и др.)
Пример:
// Все товары дороже 1000
const expensiveProducts = await Product.findAll({
where: {
price: { [Op.gt]: 1000 }
},
order: [['price', 'DESC']],
limit: 10
});
4.4. Model.findByPk()
Описание: Поиск записи по первичному ключу (primary key).
Параметры:
id— значение первичного ключаoptions— дополнительные опции (include, rejectOnEmpty и др.)
Пример:
const product = await Product.findByPk(42);
if (!product) {
console.log('Товар не найден');
}
4.5. Model.findOne()
Описание: Поиск одной записи, удовлетворяющей условиям. Возвращает первый найденный объект или null.
Параметры:
options— объект с условиями (where, include, order и др.)
Пример:
const user = await User.findOne({
where: { email: 'test@test.com' },
attributes: ['id', 'name'] // только эти поля
});
4.6. Model.update()
Описание: Обновляет записи, удовлетворяющие условиям. Возвращает массив [количество_измененных_строк].
Параметры:
values— объект с новыми значениямиoptions— объект с условиями (where обязательно)
Пример:
const [updatedCount] = await Product.update(
{ price: 49999.99 },
{ where: { id: 1 } }
);
console.log(`Обновлено ${updatedCount} записей`);
4.7. Model.destroy()
Описание: Удаляет записи, удовлетворяющие условиям. Возвращает количество удаленных строк.
Параметры:
options— объект с условиями (where обязательно)
Пример:
const deletedCount = await Product.destroy({
where: {
inStock: false,
updatedAt: { [Op.lt]: new Date('2023-01-01') }
}
});
console.log(`Удалено ${deletedCount} товаров`);
4.8. Model.findOrCreate()
Описание: Ищет запись по условию, если не находит — создает новую. Возвращает объект и флаг created.
Параметры:
options— объект с where (для поиска) и defaults (для создания)
Пример:
const [user, created] = await User.findOrCreate({
where: { email: 'new@user.com' },
defaults: {
name: 'Новый пользователь',
age: 25
}
});
if (created) {
console.log('Пользователь создан');
} else {
console.log('Пользователь уже существует');
}
4.9. Model.count()
Описание: Возвращает количество записей, удовлетворяющих условиям.
Параметры:
options— объект с условиями (where, include и др.)
Пример:
const activeUsers = await User.count({
where: { status: 'active' }
});
console.log(`Активных пользователей: ${activeUsers}`);
4.10. Model.bulkCreate()
Описание: Массовое создание записей из массива объектов.
Параметры:
records— массив объектов для вставкиoptions— опции (validate, ignoreDuplicates, updateOnDuplicate и др.)
Пример:
const products = [
{ title: 'Книга', price: 500 },
{ title: 'Ручка', price: 50 },
{ title: 'Блокнот', price: 150 }
];
const createdProducts = await Product.bulkCreate(products, {
validate: true
});
console.log(`Создано ${createdProducts.length} товаров`);
5. Реальный практический пример использования
Создадим полноценный REST API для интернет-магазина с использованием Express.js и Sequelize:
// models.js
const { Sequelize, DataTypes, Op } = require('sequelize');
const sequelize = new Sequelize({
dialect: 'sqlite',
storage: './shop.db',
logging: false
});
// Модель категории
const Category = sequelize.define('Category', {
id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true },
name: { type: DataTypes.STRING, allowNull: false, unique: true },
description: DataTypes.TEXT
});
// Модель товара
const Product = sequelize.define('Product', {
id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true },
title: { type: DataTypes.STRING, allowNull: false },
price: { type: DataTypes.DECIMAL(10, 2), allowNull: false },
stock: { type: DataTypes.INTEGER, defaultValue: 0 },
categoryId: {
type: DataTypes.INTEGER,
references: { model: Category, key: 'id' }
}
});
// Связи
Category.hasMany(Product, { foreignKey: 'categoryId' });
Product.belongsTo(Category, { foreignKey: 'categoryId' });
module.exports = { sequelize, Category, Product, Op };
// server.js
const express = require('express');
const { sequelize, Category, Product, Op } = require('./models');
const app = express();
app.use(express.json());
// Синхронизация БД
sequelize.sync({ force: true }).then(async () => {
// Начальные данные
const electronics = await Category.create({ name: 'Электроника', description: 'Гаджеты и устройства' });
await Product.create({ title: 'Смартфон', price: 29999.99, stock: 50, categoryId: electronics