← Назад к вопросам
Какие основные команды используешь для миграций в Django?
2.0 Middle🔥 191 комментариев
#Django
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Основные команды для миграций в Django
Миграции в Django — это механизм отслеживания и применения изменений схемы базы данных. Они обеспечивают версионирование БД и позволяют коллективной разработке управлять изменениями структуры данных.
Базовые команды
makemigrations
Создаёт новые файлы миграций на основе изменений в моделях.
# Создать миграции для всех приложений
python manage.py makemigrations
# Создать миграции для конкретного приложения
python manage.py makemigrations myapp
# Просмотр SQL, который будет выполнен (без создания файла)
python manage.py makemigrations --dry-run
# Создать с verbose output
python manage.py makemigrations --verbosity=2
# Создать миграцию с пустой схемой (manual migration)
python manage.py makemigrations --empty myapp --name my_custom_migration
Когда использовать:
- После изменения моделей (добавление/удаление/изменение полей)
- После добавления новых моделей
- После изменения мета-параметров моделей
migrate
Применяет миграции к базе данных.
# Применить все неприменённые миграции
python manage.py migrate
# Применить миграции для конкретного приложения
python manage.py migrate myapp
# Применить до конкретной миграции
python manage.py migrate myapp 0005_auto
# Откатить всё (применить нулевую миграцию)
python manage.py migrate myapp zero
# Выполнить с verbose output
python manage.py migrate --verbosity=2
# Выполнить в dry-run режиме (показать, что будет выполнено)
python manage.py migrate --plan
Примеры:
# Применить последнюю миграцию
python manage.py migrate
# Вернуться к конкретному состоянию
python manage.py migrate myapp 0003_auto_20210101_1234
# Полностью откатить приложение
python manage.py migrate myapp zero
Инспекция и диагностика
showmigrations
Показывает статус всех миграций.
# Показать все миграции со статусом
python manage.py showmigrations
# Показать миграции для конкретного приложения
python manage.py showmigrations myapp
# Список без форматирования
python manage.py showmigrations --list
# Показать план применения миграций
python manage.py showmigrations --plan
# Verbose вывод
python manage.py showmigrations --verbosity=2
Пример вывода:
myapp
[X] 0001_initial
[X] 0002_add_field
[ ] 0003_remove_field
X = применена, пробел = не применена
sqlmigrate
Показывает SQL, который будет выполнен для конкретной миграции.
# Показать SQL для миграции
python manage.py sqlmigrate myapp 0001_initial
# Полезно для проверки перед применением
python manage.py sqlmigrate myapp 0002_auto
Пример:
BEGIN;
--
-- Create model User
--
CREATE TABLE "myapp_user" (
"id" bigint NOT NULL PRIMARY KEY AUTOINCREMENT,
"name" varchar(100) NOT NULL
);
COMMIT;
Создание собственных миграций
Пример вручную созданной миграции
# Создать пустую миграцию с пользовательским именем
python manage.py makemigrations --empty myapp --name add_user_permissions
# myapp/migrations/0003_add_user_permissions.py
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_auto_previous'),
]
operations = [
# Здесь добавляются операции
]
RunPython для кастомной логики
from django.db import migrations
from django.utils import timezone
def set_default_timestamps(apps, schema_editor):
User = apps.get_model('myapp', 'User')
for user in User.objects.all():
user.created_at = timezone.now()
user.save()
def reverse_timestamps(apps, schema_editor):
User = apps.get_model('myapp', 'User')
User.objects.all().update(created_at=None)
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_previous'),
]
operations = [
migrations.RunPython(set_default_timestamps, reverse_timestamps),
]
SQL миграции
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('myapp', '0002_previous'),
]
operations = [
migrations.RunSQL(
sql="UPDATE myapp_user SET status = 'active' WHERE status IS NULL;",
reverse_sql="UPDATE myapp_user SET status = NULL WHERE status = 'active';"
),
]
Операции миграций
CreateModel
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(primary_key=True)),
('email', models.EmailField(unique=True)),
('name', models.CharField(max_length=100)),
],
)
AddField
migrations.AddField(
model_name='user',
name='bio',
field=models.TextField(default=''),
preserve_default=False,
)
RemoveField
migrations.RemoveField(
model_name='user',
name='old_field',
)
AlterField
migrations.AlterField(
model_name='user',
name='email',
field=models.EmailField(max_length=254, unique=True),
)
RenameField
migrations.RenameField(
model_name='user',
old_name='username',
new_name='login',
)
Практические сценарии
Сценарий 1: Добавление нового поля с данными
# models.py
class User(models.Model):
name = models.CharField(max_length=100)
status = models.CharField(max_length=20, default='active') # Новое поле
# Шаг 1: Создать миграцию
python manage.py makemigrations
# Шаг 2: Применить
python manage.py migrate
Сценарий 2: Откат и переделка
# Показать последние миграции
python manage.py showmigrations myapp
# Откатить последнюю миграцию
python manage.py migrate myapp 0004_previous
# Удалить файл последней миграции
rm myapp/migrations/0005_wrong_migration.py
# Создать правильную миграцию
python manage.py makemigrations
# Применить
python manage.py migrate
Сценарий 3: Миграция данных
# Создать пустую миграцию
python manage.py makemigrations --empty myapp --name migrate_user_data
# В файле миграции
from django.db import migrations
def migrate_data(apps, schema_editor):
User = apps.get_model('myapp', 'User')
for user in User.objects.all():
# Преобразование данных
user.email = user.email.lower()
user.save()
class Migration(migrations.Migration):
dependencies = [
('myapp', '0005_previous'),
]
operations = [
migrations.RunPython(migrate_data),
]
Лучшие практики
- Всегда создавай миграции — не редактируй БД вручную
- Проверяй SQL — используй
sqlmigrateперед применением - Тестируй миграции — проверь обратный откат
- Используй имена миграций — создавай описательные имена
- Избегай RunPython в больших таблицах — используй батч-операции
- Откатывай в production — миграции должны быть reversible
- Документируй сложные миграции — добавляй комментарии
Команды в цикле разработки
# Разработка: изменил модель
python manage.py makemigrations
python manage.py migrate
# Проверка: что произойдёт
python manage.py sqlmigrate myapp 0001_initial
# Отладка: какой статус
python manage.py showmigrations
# Откат для пересоздания
python manage.py migrate myapp zero
python manage.py makemigrations # Пересоздать с нуля
Заключение
Миграции в Django — мощный инструмент для управления схемой БД. Основные команды:
makemigrations— созданиеmigrate— применениеshowmigrations— статусsqlmigrate— проверка SQL
Правильное использование миграций обеспечивает надёжность, трассируемость и возможность отката любых изменений в production.