Как создать и откатить миграции базы данных в Django

Ответ

Управление миграциями в Django осуществляется через утилиту manage.py. Основной цикл работы включает создание файлов миграций на основе изменений в моделях и их последующее применение к базе данных.

1. Создание и применение миграций

Двухэтапный процесс для обновления схемы БД:

  • Создать файл миграции: Команда анализирует изменения в файлах models.py и создает новый файл миграции в папке migrations соответствующего приложения.
    python manage.py makemigrations <app_name>
  • Применить миграции к БД: Команда выполняет все еще не примененные миграции, изменяя схему базы данных в соответствии с ними.
    python manage.py migrate

2. Откат миграций

Откат позволяет вернуть схему базы данных к состоянию определенной миграции.

  • Откат до конкретной миграции: Укажите имя приложения и имя файла миграции, к состоянию до которой нужно вернуться.
    # Пример: откат миграции 0003_... в приложении 'myapp'
    # Нужно указать предыдущую миграцию - 0002
    python manage.py migrate myapp 0002_some_previous_migration
  • Полный откат всех миграций приложения: Используется специальное имя миграции zero.
    python manage.py migrate myapp zero

3. Полезные команды

  • Показать статус миграций: Отображает список всех миграций и помечает примененные ([X]).
    python manage.py showmigrations
  • Показать SQL-код миграции: Генерирует SQL-запросы, которые будут выполнены для указанной миграции, без их реального применения.
    python manage.py sqlmigrate myapp 0003_some_new_migration

Ответ 18+ 🔞

Давай разберём эту скучную документацию про миграции в Django, как будто я тебе объясняю за кружкой пива, а не на корпоративном тренинге. Сиди, слушай, не перебивай.

Вот смотри, вся эта движуха с миграциями — это как история с Герасимом и Муму, только про базу данных. Ты меняешь модель в models.py — это как Герасим решил, что собаке нужно не будку, а трёхкомнатную квартиру. Но база данных-то об этом не знает, она как барыня-помещица: «А я не разрешала!». Чтобы база не охуела от твоих самодеятельных изменений, нужен официальный приказ — файл миграции.

1. Рождение и внедрение миграции (Двухэтапный пиздец)

Сначала ты пишешь в models.py, что хочешь добавить поле is_awesome = models.BooleanField(default=True). База данных в этот момент смотрит на тебя как на идиота и говорит: «А у меня, сука, такого поля нет!».

Этап первый: Создание бумажки (makemigrations). Ты командуешь Джанго: «Слушай, братва, я тут накосячил в коде, сделай мне официальную бумажку, чтобы база не взбрыкнула».

python manage.py makemigrations myapp

Джанго идёт, смотрит на твои модели, хмыкает и создаёт в папке migrations файлик типа 0004_add_field_is_awesome.py. Это и есть та самая бумага с печатью, приказ для базы. Пока что это просто текст, ничего не произошло. База всё ещё охуевает.

Этап второй: Исполнение приказа (migrate). Теперь ты эту бумажку суёшь базе данных под нос:

python manage.py migrate

База читает, вздыхает, говорит «Ну блядь, опять эти программисты со своими приколами...» — и на самом деле создаёт в таблице новый столбец. Вот теперь всё, схема обновлена. Герасим (твой код) может спокойно обращаться к полю is_awesome, а база (барыня) уже не возмущается.

2. Откат, или «Ой, бля, я накосячил!»

Бывает такое — добавил поле, запустил миграцию, а потом понял, что это была пиздец какая-то идея. Надо всё откатить. Это как если бы Герасим, утопив Муму, вдруг осознал: «Что же я, мудак, сделал?».

  • Откат до конкретной точки: Допустим, у тебя есть миграции 0001, 0002, 0003. Ты применил 0003, а она оказалась говном. Надо откатиться к состоянию после 0002.

    python manage.py migrate myapp 0002_previous_migration_name

    Джанго возьмёт и отменит все операции из миграции 0003. База вернётся в то состояние, в котором была после 0002. Всё, как будто 0003 и не было. Чисто, аккуратно.

  • Полный пиздец и обнуление (migrate zero): Это когда ты так заигрался, что проще всё начать с чистого листа для этого приложения.

    python manage.py migrate myapp zero

    Эта команда — аналог «Иди нахуй, мужик!». Она откатывает ВСЕ миграции приложения myapp. Все таблицы, которые были созданы миграциями этого приложения, будут накрыты медным тазом (удалены). Используй с умом, а то так и до «вротберунчика» недалеко.

3. Полезные фишки, чтобы не облажаться

  • showmigrations — «А что у нас по статусу?» Запустишь — и тебе выведется список всех миграций всех приложений. Те, что уже применены, будут с галочкой [X]. Те, что нет — с пробелом [ ]. Сразу видно, кто в лес, кто по дрова. Охуенно полезно, когда непонятно, что уже накатилось, а что нет.

    python manage.py showmigrations
  • sqlmigrate — «А что ты, сука, собираешься сделать?» Самая хитрая команда. Она не применяет миграцию, а показывает SQL-код, который будет выполнен. Это как заглянуть в будущее. Хочешь проверить, не снесёт ли миграция 0003 твою любимую таблицу users? Посмотри SQL!

    python manage.py sqlmigrate myapp 0003_add_field_is_awesome

    Выведет что-то вроде ALTER TABLE "myapp_mymodel" ADD COLUMN "is_awesome" boolean DEFAULT TRUE NOT NULL;. Теперь ты точно знаешь, что тебя ждёт. Волнение ебать — ноль.

Короче, суть: makemigrations — это написать приказ, migrate — это его исполнить. А всякие showmigrations и sqlmigrate — это чтобы не быть слепым пиздюком и понимать, что происходит. Всё просто, как три копейки. Главное — не путать этапы, а то получится как у того немого Герасима: хотел как лучше, а в итоге — «Мууу...».