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

Есть ли порядок применения миграций?

2.3 Middle🔥 171 комментариев
#DevOps и инфраструктура#Базы данных (SQL)

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

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

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

Порядок применения миграций в Python

Да, порядок — критически важен. Это основа целостности базы данных и воспроизводимости разработки.

Основной принцип

Миграции должны применяться строго в хронологическом порядке — как история изменений БД:

001_create_users.sql
002_add_email_users.sql
003_create_posts.sql
004_add_fk_posts_users.sql
005_add_index_posts_user_id.sql

Каждая миграция зависит от состояния БД после применения предыдущей.

Почему порядок критичен

1. Зависимости между изменениями

-- 001_create_users.sql
CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR);

-- 002_add_index.sql
CREATE INDEX idx_users_name ON users(name);
-- Без первой миграции вторая упадёт!

2. Целостность данных

-- 001: Добавляю column
ALTER TABLE orders ADD COLUMN user_id INTEGER;

-- 002: Добавляю foreign key
ALTER TABLE orders ADD CONSTRAINT fk_user 
    FOREIGN KEY(user_id) REFERENCES users(id);

Если применить в обратном порядке — ошибка.

3. Откат (rollback)

-- 002_add_fk.sql
ALTER TABLE orders DROP CONSTRAINT fk_user;  -- DOWN

-- 001_create_table.sql
DROP TABLE orders;  -- DOWN

Откат также идёт в обратном порядке.

Фреймворки и инструменты

Alembic (SQLAlchemy)

# Миграции хранятся в alembic/versions/
# С версией и временной меткой
# alembic/versions/2024_01_15_001_create_users.py

# Просмотр истории
alembic current  # Текущая версия
alembic history  # Все миграции
alembic upgrade head  # Применить все вверх
alembic downgrade -1  # Откатить на одну назад

Goose (Go-style)

-- Файлы нумеруются: 001_create_users.sql, 002_add_posts.sql
-- Порядок имён гарантирует последовательность

-- +goose Up
CREATE TABLE users (...);

-- +goose Down
DROP TABLE users;

Django ORM

# Django отслеживает в django_migrations
python manage.py migrate  # Применить все
python manage.py migrate app_name 0002  # К конкретной версии

Как БД отслеживает порядок

Все инструменты ведут таблицу истории:

-- Alembic
CREATE TABLE alembic_version (
    version_num VARCHAR(32) PRIMARY KEY
);

-- Django
CREATE TABLE django_migrations (
    id SERIAL PRIMARY KEY,
    app VARCHAR(255),
    name VARCHAR(255),
    applied TIMESTAMP
);

При запуске:

  1. Проверяет таблицу истории
  2. Находит последнюю применённую
  3. Применяет следующие по порядку

Обеспечение порядка

1. Временные метки или номера

# Хорошо
001_create_users.py
002_add_email.py
003_create_posts.py

2. Никогда не меняй имена уже применённых миграций

3. Не совмещай несвязанные изменения в одной миграции

Best Practice

Используй инструменты, которые гарантируют порядок:

  • Alembic (SQLAlchemy)
  • Goose (raw SQL)
  • Django migrations

Вывод: порядок миграций — это хронологическая история БД. Её нельзя менять или пропускать.

Есть ли порядок применения миграций? | PrepBro