Ответ
Миграции в Django — это система контроля версий для схемы вашей базы данных. Они позволяют эволюционно изменять модели и автоматически применять эти изменения к БД, сохраняя при этом данные.
Основной принцип работы:
- Изменение моделей: Вы вносите изменения в файл
models.py(например, добавляете новое поле). - Создание миграции: Команда
python manage.py makemigrationsанализирует изменения и генерирует файл миграции — Python-код, описывающий, как перейти от старого состояния схемы к новому. - Применение миграции: Команда
python manage.py migrateвыполняет код из файла миграции, изменяя структуру таблиц в базе данных.
Django отслеживает примененные миграции в специальной таблице django_migrations.
Пример:
Допустим, у нас есть модель Project:
# myapp/models.py
from django.db import models
class Project(models.Model):
name = models.CharField(max_length=200)
Теперь добавим поле deadline:
# myapp/models.py
from django.db import models
class Project(models.Model):
name = models.CharField(max_length=200)
deadline = models.DateField(null=True, blank=True) # Новое поле
Выполняем команды в терминале:
# 1. Создаем файл миграции (например, 0002_project_deadline.py)
python manage.py makemigrations myapp
# 2. Применяем миграцию к базе данных
python manage.py migrate myapp
Ключевые преимущества:
- Надежность: Изменения схемы версионируются и применяются последовательно.
- Командная работа: Все разработчики работают с единой историей изменений схемы БД.
- Автоматизация: Не нужно писать SQL-запросы вручную для изменения таблиц.
Ответ 18+ 🔞
О, смотри-ка, миграции в Django, ну это же просто пиздец как важно, ага. Представь себе, ты пишешь модель, всё работает, а потом бац — надо добавить поле. И что, вручную лезть в базу и SQL-скрипты городить? Да ну нахуй, это же каменный век, блядь.
Вот как это работает, по-человечьи:
- Ты накосячил в моделях. Ну или не накосячил, а просто добавил что-то. Допустим, была модель
Projectс одним полемname. А ты решил, что мало, и впихнул туда ещёdeadline. В рот меня чих-пых, теперь надо базу под это дело перелопатить. - Ты говоришь Джанге: «Слушай, я тут натворил, сделай что-нибудь».
python manage.py makemigrations myappДжанга смотрит на твой
models.py, потом на то, что уже в базе, и охуевает от разницы. Но не паникует, а пишет на Питоне инструкцию «как из состояния А попасть в состояние Б». Это и есть файл миграции — типа0002_project_deadline.py. Там по полочкам разложено: «создать колонкуdeadlineв таблицеmyapp_project, да ещё иnull=Trueсделать, чтоб старые записи не посыпались». - Ты говоришь Джанге: «Ну так примени уже эту хуйню».
python manage.py migrate myappИ она берёт эту инструкцию и аккуратно, блядь, выполняет её на реальной базе. Всё, поле добавилось. А чтобы не запутаться, что уже сделано, а что нет, она ведёт учёт в специальной таблице
django_migrations. Типа журнал учёта, чтобы не наебнуться и не применить одно и то же дважды.
А зачем это всё, спросишь? Да затем, сука, что без этого — пиздец и бардак.
- Не надо быть гуру SQL. Не нужно самому писать
ALTER TABLE myapp_project ADD COLUMN deadline date NULL;. Джанга за тебя всё сделает, и сделает правильно, ёпта. - Всё под контролем. Каждое изменение — это файл. Его можно в гите закоммитить, посмотреть историю, откатиться если чё. Красота, блядь.
- В команде не перебьёшь друг другу руки. Один сделал миграцию, залил в репу, другой потянул и применил. И никто никого не послал нахуй из-за конфликта схемы.
Вот смотри, как это выглядит вживую. Было:
# myapp/models.py
from django.db import models
class Project(models.Model):
name = models.CharField(max_length=200)
Стало:
# myapp/models.py
from django.db import models
class Project(models.Model):
name = models.CharField(max_length=200)
deadline = models.DateField(null=True, blank=True) # Новое поле, ёбана!
И в терминале:
# 1. Джанга, сообрази на бумажке, что делать!
python manage.py makemigrations myapp
# 2. А теперь иди и сделай это!
python manage.py migrate myapp
Всё, готово. Никакого ручного геморроя. Главное — не забывай делать makemigrations после изменений в моделях, а то потом будешь охуевать, почему код есть, а поля в базе нет. И да, migrate применяй, а то файлы миграций будут как мёртвому припарки — лежать и пылиться.