Короткий ответ
Обе команды связаны с механизмом миграций — способом Django переносить изменения моделей в схему базы данных. makemigrations создаёт файлы миграций по изменениям моделей, а migrate применяет их к базе данных.
Как это работает подробнее
Процесс обычно выглядит так: изменили модель, сгенерировали файл миграции, затем применили его к схеме базы данных.
- Изменение моделей. После правки модели
makemigrationsсканирует приложение и формирует файл миграции с описанием будущих изменений. - Файлы миграций. Содержат инструкции, по сути близкие к SQL, но сами изменения к базе данных пока не применяют.
- Применение изменений.
migrateвыполняет инструкции из файлов и создаёт или обновляет таблицы в соответствии с моделями. - Версионирование. Миграции хранят историю изменений, поддерживают откат и должны лежать в системе контроля версий.
- Статус миграций. Служебная команда
showmigrationsпоказывает, какие миграции уже применены.
Пример кода
Рабочий цикл миграций
# после изменения моделей генерируем файл миграции
python manage.py makemigrations
# применяем миграции к базе данных
python manage.py migrate
# проверяем статус применённых миграций
python manage.py showmigrationsЧто использовать на практике
- Порядок команд. Сначала
makemigrationsдля генерации файла, затемmigrateдля реального изменения схемы. - Контроль версий. Храни файлы миграций в репозитории, чтобы вся команда применяла одинаковые изменения схемы.
- Проверка статуса. Используй
showmigrations, чтобы понять, какие миграции уже применены.
Подводные камни
- Забытый migrate. После
makemigrationsбезmigrateсхема базы не меняется, и код может падать на несуществующих полях. - Правка применённых файлов. Уже применённые миграции не редактируют — лучше создать новую миграцию, иначе история изменений рассинхронизируется.
- Миграции вне VCS. Если файлы миграций не хранить в системе контроля версий, разработчики получат разные схемы баз.
Как отвечать на собеседовании
- Начать с определения миграций как механизма переноса изменений моделей в схему базы → пояснить, что
makemigrationsтолько создаёт файлы, аmigrateприменяет их → упомянутьshowmigrations, хранение миграций в системе контроля версий и откат.