Что такое сиды (Seeds) в контексте баз данных и Node.js?

«Что такое сиды (Seeds) в контексте баз данных и Node.js?» — вопрос из категории Базы данных, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сиды (Seeds) — это скрипты для заполнения базы данных предопределёнными (начальными) данными. В Node.js-проектах они используются вместе с миграциями для приведения базы данных в предсказуемое состояние, необходимое для работы приложения.

Зачем они нужны в Node.js проекте?

  1. Наполнение справочными данными: Роли пользователей (admin, user), типы подписок, список стран, категории товаров.
  2. Создание тестовых данных: Для разработки, демо-стендов или наполнения staging-окружения.
  3. Добавление обязательных записей: Учётная запись супер-администратора, настройки по умолчанию.

Пример сида с использованием Knex.js (популярный SQL query builder для Node.js):

// seeds/01_initial_roles.js
exports.seed = async function(knex) {
  // Deletes ALL existing entries
  await knex('user_roles').del();

  // Inserts seed entries
  return knex('user_roles').insert([
    { id: 1, name: 'admin', description: 'Full system access' },
    { id: 2, name: 'moderator', description: 'Can manage content' },
    { id: 3, name: 'user', description: 'Regular user' },
  ]);
};

Запуск: npx knex seed:run

Пример сида для создания тестового пользователя с хешированным паролом (используя bcrypt):

// seeds/02_demo_users.js
const bcrypt = require('bcrypt');

exports.seed = async function(knex) {
  const saltRounds = 10;
  const hashedPassword = await bcrypt.hash('demo123', saltRounds);

  return knex('users').insert([
    {
      email: 'admin@example.com',
      password_hash: hashedPassword,
      role_id: 1, // Ссылается на роль 'admin' из предыдущего сида
      is_active: true,
      created_at: knex.fn.now()
    }
  ]);
};

Best Practices в Node.js:

  • Идемпотентность: Сиды должны безопасно выполняться многократно. Часто начинаются с очистки таблиц (del() или truncate()).
  • Порядок выполнения: Важен из-за внешних ключей. Сиды для справочных таблиц (роли) должны выполняться перед сидами, которые на них ссылаются (пользователи).
  • Не для продакшена: Как правило, сиды с тестовыми данными не запускаются на production. Для обязательных справочных данных иногда используют миграции или отдельные скрипты деплоя.
  • Использование с ORM: Аналогичная логика работает с Sequelize, TypeORM и другими библиотеками.