Sequelize для JavaScript (Node.js): полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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                    

Рекомендаций