Django имеет несколько команд для взаимодействия со схемой базы данных. Одни применяются очень часто в процессе разработки сайта, другие реже и не всегда все проходит гладко при их использовании. Давайте разберемся с некоторыми из них.
С помощью этой команды можно создавать и формализовывать изменения, которые необходимо внести в текущую схему базы данных, на основании изменений, внесенных в модель. Общий синтаксис команды следующий:
1python manage.py makemigrations [app_label [app_label ...]]
После запуска этой команды для перечисленных приложений (а если они не указаны, то для всех приложений проекта), Django начнет сканировать и сравнивать модели приложений с версиями, которые содержаться в текущий момент в миграционных файлах проекта и затем новый набор изменений будет записан в новый файл миграций. Необходимо проверять сформированные миграции, чтобы понять какие параметры схемы утилита makemigrations посчитала измененными. Она не идеальна и для сложных изменений она может определить совсем не те изменения, которые вы ожидаете.
В результате работы данной утилиты формируется файл миграции, который является подклассом для migrations.Migration. Давайте рассмотрим один в качестве примера:
1from django.db import migrations, models
2
3class Migration(migrations.Migration):
4 dependencies = [('migrations', '0001_initial')]
5 operations = [
6 migrations.DeleteModel('Tribble'),
7 migrations.AddField('Author', 'rating', models.IntegerField(default=0)),
8 ]
Основными атрибутами класса, с которым обычно сталкивается Django в процессе миграций, являются:
Вам редко, если вообще когда-либо потребуется редактировать файлы миграции вручную, но это вполне возможно сделать, если вам это нужно. Некоторые из большинства сложных операций Django не удастся идентифицировать автоматически и единственным возможным способом их применить будет написание миграции вручную.
Некоторые дополнительные полезные ключи, которые можно применять вместе с утилитой makemigrations:
1--empty
Формирует пустой файл миграции для конкретного приложения для ручного редактирования. Только для продвинутых пользователей.
1--merge
Позволяет анализировать и фиксить возможные конфликты при миграции.
1--dry-run
Запускает процесс анализа и создания файла миграции, но при этом сам файл не записывает. Можно использовать для проверки наличия изменений в модели и анализа изменений, которые будут отражены в файле миграций.
1--no-header
Генерирует файл миграции, в заголовке которого отсутствует версия Django и отметка о дате и времени создания.
1--name
Если вы хотите сами задать имя файлу миграции, вместо автоматически генерируемого, то нужно использовать опцию --name в следующем формате:
1python manage.py makemigrations --name changed_my_model your_app_label
Как только у нас появился новый файл миграции, либо автоматически с использованием утилиты makemigrations, либо созданный руками, изменения, которые хранятся в нем нужно применить с существующей схеме базы данных. Для этого используется команда migrate.
Общий синтаксис применения команды, согласно официальной документации, следующий:
1django-admin migrate [app_label] [migration_name]
Результаты выполнения этой команды зависят от передаваемых аргументов:
Примечание: данный способ можно использовать для отката изменений схемы базы данных. Но нужно быть внимательным при использовании данного механизма, т.к. в случае если в откатываемых таблицах или колонках были данные, то они могут быть утеряны. Обязательно делайте копию базы данных.
Полезные опции для данной команды, которые можно использовать:
1--database DATABASE
Определяет базу данных к которой будут применяться миграции. По умолчанию используется дефолтная.
1--fake
Помечает все миграции вплоть до указанной как примененные, но без физического применения в базу данных и изменения схемы базы данных. Это можно использовать опытным пользователям для манипуляций с текущим состоянием миграции напрямую, если например изменения были применены вручную.
1--plan
Показывает операции миграций, которые будут исполнены при выполнении указанной команды migrate.
1--check
Команда завершает работу с ненулевым результатом, когда обнаруживаются не примененные миграции.
В случае если необходимо увидеть какой SQL код будет сгенерирован для конкретной миграции, можно использовать команду sqlmigrate.
1django-admin sqlmigrate app_label migration_name
Данная команда требует активного подключения к базе данных, которое будет использовано для того, чтобы разрешить имена ограничений (to resolve constraint names). Это означает, что SQL код, вносящий изменения в базу данных, будет сгенерирован по отношению к копии базы данных, к которой планируется применить эти изменения.
Полезные опции для данной команды:
1--backwards
Генерирует SQL код для отмены примененных миграций. По умолчанию, SQL генерируется в направлении применения изменений, а не отката.
1--database DATABASE
Определяет базу данных, которая по отношению к которой генерируется SQL код. По умолчанию используется дефолтная база данных.
Синтаксис команды:
1django-admin showmigrations [app_label [app_label ...]]
Команда позволяет увидеть все миграции текущего проекта. Данную команду можно использовать одним из двух способов, которые определяются одной из опций ниже:
1--list, -l
Данная опция является используемой по умолчанию. Она показывает список всех миграций для каждого приложения, а также показывает применена ли данная миграция (помечается символами [X]) или нет. Пример вывода в консоль после использования данной команды можно посмотреть ниже:
1admin
2 [X] 0001_initial
3 [X] 0002_logentry_remove_auto_add
4 [X] 0003_logentry_add_action_flag_choices
5
6auth
7 [X] 0001_initial
8 [X] 0002_alter_permission_name_max_length
9 [X] 0003_alter_user_email_max_length
10 [X] 0004_alter_user_username_opts
11
12blog
13 [X] 0001_initial
14 [X] 0002_post_image_url
15
16contenttypes
17 [X] 0001_initial
18 [X] 0002_remove_content_type_name
19
20dailyAnalysis
21 [X] 0001_initial
22 [X] 0002_auto_20200518_1608
23 [] 0003_image
Приложения без миграций также будут отображаться, но миграции под ними в консоль выводится не будут.
1--plan, -p
Показывает план миграций, которому Django будет следовать применяя миграции. Также как и при использовании --list примененные миграции помечаются символами [X].
Использование аргумента app_labels ограничивает вывод только указанными приложениями, однако зависимые миграции из других приложений также могут быть включены в вывод.
1--database DATABASE
Опция database определяет базу данных, которую мы хотим исследовать. По умолчанию используется дефолтная база.
В официальной документации есть примеры использования двух вариантов следующих конструкций:
1django-admin makemigrations
2python manage.py makemigrations
Давайте разберемся почему. django-admin это утилита для командной строки для административных задач. Также для любого проекта Django автоматически создается файл manage.py. Он делает те же самые вещи, что и django-admin, а также устанавливает переменную среды DJANGO_SETTINGS_MODULE, которая в свою очередь указывает на файл настроек проекта settings.py.