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

Зачем нужна команда migrate в Django?

2.3 Middle🔥 161 комментариев
#Git и VCS#Soft Skills#Архитектура и паттерны

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

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

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

Зачем нужна команда migrate в Django

Команда migrate — это фундаментальный инструмент Django для управления схемой базы данных. Она позволяет применять и откатывать изменения в структуре БД упорядоченным и воспроизводимым способом.

Основная задача

Команда migrate применяет миграции — файлы, которые описывают изменения в структуре БД. Это позволяет:

  • Синхронизировать модели Python с реальной схемой БД
  • Отслеживать историю изменений схемы
  • Переходить между версиями приложения
  • Совместно работать в команде

Проблема без миграций

Без migrate пришлось бы вручную писать SQL:

# models.py
class User(models.Model):
    username = models.CharField(max_length=100)
    email = models.EmailField()
    created_at = models.DateTimeField(auto_now_add=True)

# Что происходит?
# - Модель создана в коде
# - БД ничего не знает об этом
# - Нужно вручную выполнить SQL:
# CREATE TABLE users (id INT PRIMARY KEY, username VARCHAR(100), ...)

# Потом добавили поле
class User(models.Model):
    username = models.CharField(max_length=100)
    email = models.EmailField()
    phone = models.CharField(max_length=20)  # Новое поле!
    created_at = models.DateTimeField(auto_now_add=True)

# Снова нужно вручную:
# ALTER TABLE users ADD COLUMN phone VARCHAR(20);

# И каждый разработчик должен помнить все эти команды
# И выполнить их в правильном порядке
# И не забыть их в production

Как работает migrate

1. Создание миграции (makemigrations)

# Django анализирует модели и находит отличия от последней миграции
python manage.py makemigrations

# Результат: новый файл в migrations/
# migrations/0001_initial.py
# migrations/0002_add_phone_field.py
# migrations/0003_alter_user_email.py

2. Применение миграции (migrate)

# Django выполняет SQL команды из миграции
python manage.py migrate

# Результат:
# Operations to perform:
#   Apply all migrations: admin, auth, users
# Running migrations:
#   Applying users.0001_initial... OK
#   Applying users.0002_add_phone_field... OK
#   Applying users.0003_alter_user_email... OK

Пример реальной миграции

# migrations/0002_add_phone_field.py - автоматически создана
from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        ('users', '0001_initial'),  # Зависит от предыдущей миграции
    ]

    operations = [
        migrations.AddField(
            model_name='user',
            name='phone',
            field=models.CharField(max_length=20, blank=True),
        ),
    ]

# Эта миграция:
# 1. Выполнится после 0001_initial
# 2. Выполнит: ALTER TABLE users ADD COLUMN phone VARCHAR(20)
# 3. Записывает это в таблицу django_migrations

Основные команды migrate

1. Применить ВСЕ миграции

python manage.py migrate

# Применит все неприменённые миграции в порядке очередности

2. Применить миграции одного приложения

python manage.py migrate users

# Применит только миграции из users приложения

3. Откатить на конкретную миграцию

python manage.py migrate users 0001_initial

# Откатит все миграции users после 0001_initial
# Удалит поля, которые добавляла миграция 0002, 0003, и т.д.

4. Откатить ВСЕ миграции

python manage.py migrate users zero

# Полностью откатит приложение users
# Удалит все таблицы

5. Показать статус миграций

python manage.py showmigrations

# users
#  [X] 0001_initial
#  [X] 0002_add_phone_field
#  [ ] 0003_alter_user_email  # [ ] = не применена

Почему это важно для команды

1. Синхронизация между разработчиками

# Разработчик A делает
class User(models.Model):
    name = models.CharField(max_length=100)
    # Создаёт миграцию: 0001_initial.py
    # git commit

# Разработчик B делает
git pull  # Получает 0001_initial.py от A
python manage.py migrate  # Применяет миграцию
# Теперь у B точно такая же БД структура, как у A

2. Развёртывание в production

# CI/CD pipeline перед запуском приложения
git pull origin main
python manage.py migrate  # Применить все новые миграции
python manage.py collectstatic  # Собрать статику
gunicorn myapp.wsgi  # Запустить приложение

# БД уже готова к новой версии кода

3. История изменений

# Можно увидеть всю историю изменений БД
python manage.py showmigrations

# users
#  [X] 0001_initial - 2024-01-15
#  [X] 0002_add_phone_field - 2024-01-20
#  [X] 0003_remove_phone_add_phone_number - 2024-01-25
#  [X] 0004_add_timezone - 2024-02-01

# Полная история кто, когда и что менял в БД

Примеры использования

Пример 1: Добавить новое поле

# models.py
class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    # Новое поле
    author = models.ForeignKey(User, on_delete=models.CASCADE)

# Команды
python manage.py makemigrations articles
# Создаст: migrations/0002_article_author.py

python manage.py migrate articles
# Выполнит миграцию

# Результат: добавлено поле author в таблицу articles

Пример 2: Изменить тип поля

# models.py
class User(models.Model):
    # Было
    # age = models.IntegerField()
    
    # Стало
    age = models.DecimalField(max_digits=5, decimal_places=2)

# Команды
python manage.py makemigrations
# Создаст миграцию с ALTER TABLE

python manage.py migrate
# Выполнит изменение типа

Пример 3: Откатить ошибку

# Разработчик сделал ошибку в 0005_bad_migration.py
# Хотим откатить только эту миграцию

python manage.py migrate users 0004_previous_ok
# Откатит 0005

# Удаляем файл 0005_bad_migration.py
# Исправляем ошибку
# Создаём новую миграцию
python manage.py makemigrations
# Создаст: 0006_fix_bad_migration.py

python manage.py migrate
# Применяет исправленную версию

Лучшие практики

1. Создавайте миграции часто

# Правильно
python manage.py makemigrations
python manage.py migrate
# После каждого значимого изменения модели

# Неправильно
# Скопить 10 изменений модели, потом одна большая миграция

2. Писывайте осмысленные имена

# Правильно
python manage.py makemigrations --name add_user_email_field
# Создаст: 0005_add_user_email_field.py

# Неправильно
python manage.py makemigrations
# Создаст: 0005_auto_2024_01_15_1545.py (непонятное имя)

3. Всегда тестируйте откаты

# Перед деплоем
python manage.py migrate
python manage.py migrate users zero  # Откатить всё
python manage.py migrate              # Применить заново

# Если этот процесс сломается, вы узнаете до production

4. Никогда не удаляйте миграции

# Неправильно
rm migrations/0001_initial.py

# Правильно
# Даже если миграция ошибочная, пишите новую миграцию, которая исправляет ошибку
python manage.py makemigrations --name fix_initial_migration

Заключение

Команда migrate — это система управления версиями для базы данных. Она гарантирует, что:

  • Все разработчики имеют одинаковую БД структуру
  • История изменений полностью отслеживается
  • Можно безопасно откатить любые изменения
  • Развёртывание в production воспроизводимо и надёжно