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

Какие основные команды используешь для миграций в 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),
    ]

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

  1. Всегда создавай миграции — не редактируй БД вручную
  2. Проверяй SQL — используй sqlmigrate перед применением
  3. Тестируй миграции — проверь обратный откат
  4. Используй имена миграций — создавай описательные имена
  5. Избегай RunPython в больших таблицах — используй батч-операции
  6. Откатывай в production — миграции должны быть reversible
  7. Документируй сложные миграции — добавляй комментарии

Команды в цикле разработки

# Разработка: изменил модель
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.

Какие основные команды используешь для миграций в Django? | PrepBro