← Назад к вопросам

Что такое миграция в ORM?

2.2 Middle🔥 21 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое миграция в ORM?

Миграция в ORM — это версионированный набор инструкций, которые описывают изменения структуры базы данных. Это механизм для управления схемой БД, позволяющий командам совместно работать с изменениями, откатывать их и отслеживать историю эволюции базы.

Для чего нужны миграции?

  • Версионирование схемы БД — как git, но для базы данных
  • Команды на одной странице — все видят, какие изменения были внесены
  • Откаты — возможность отменить изменение и вернуться к предыдущему состоянию
  • Развёртывание на разные окружения — одинаковая схема везде
  • История изменений — кто, когда и почему изменил структуру

Типичный жизненный цикл миграции

up (forward) ↑ ↓ down (rollback): состояние A → состояние B → состояние A

Пример с TypeORM

import { MigrationInterface, QueryRunner, Table } from "typeorm";

export class CreateUsersTable1234567890000 implements MigrationInterface {
  
  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.createTable(
      new Table({
        name: "users",
        columns: [
          {
            name: "id",
            type: "uuid",
            isPrimary: true,
            generationStrategy: "uuid",
            default: "uuid_generate_v4()",
          },
          {
            name: "email",
            type: "varchar",
            isUnique: true,
          },
          {
            name: "created_at",
            type: "timestamp",
            default: "CURRENT_TIMESTAMP",
          },
        ],
      })
    );
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.dropTable("users");
  }
}

Пример с Sequelize

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable("users", {
      id: {
        type: Sequelize.UUID,
        primaryKey: true,
        defaultValue: Sequelize.UUIDV4,
      },
      email: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: true,
      },
      created_at: {
        type: Sequelize.DATE,
        defaultValue: Sequelize.NOW,
      },
    });
  },

  down: async (queryInterface) => {
    await queryInterface.dropTable("users");
  },
};

Best Practices при работе с миграциями

  1. Атомарные миграции — одна миграция = одно логическое изменение
  2. Всегда включайте откат (down) — не забывайте реализовать обратную операцию
  3. Тестируйте откаты — убедитесь, что down работает корректно
  4. Не редактируйте старые миграции — создавайте новые
  5. Описательные имена — CreateUsersTable, не migration_1
  6. Миграции в git — всегда коммитьте файлы миграций
Что такое миграция в ORM? | PrepBro