← Назад к вопросам
Зачем нужна команда 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 воспроизводимо и надёжно