Есть ли порядок применения миграций?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Порядок применения миграций в 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. Временные метки или номера
# Хорошо
001_create_users.py
002_add_email.py
003_create_posts.py
2. Никогда не меняй имена уже применённых миграций
3. Не совмещай несвязанные изменения в одной миграции
Best Practice
Используй инструменты, которые гарантируют порядок:
- Alembic (SQLAlchemy)
- Goose (raw SQL)
- Django migrations
Вывод: порядок миграций — это хронологическая история БД. Её нельзя менять или пропускать.