Редактор схемы¶
- class BaseDatabaseSchemaEditor¶
Система миграции Django разделена на две части; логика для расчета и хранения операций, которые следует выполнить (django.db.migrations), и уровень абстракции базы данных, который превращает такие вещи, как «создание модели» или «удаление поля» в SQL — это задача SchemaEditor.
Маловероятно, что вы захотите напрямую взаимодействовать с SchemaEditor как обычный разработчик, использующий Django, но если вы хотите написать свою собственную систему миграции или у вас есть более продвинутые потребности, это намного приятнее, чем писать SQL.
Каждая серверная часть базы данных в Django предоставляет свою собственную версию SchemaEditor, и она всегда доступна через контекстный менеджер Connection.schema_editor():
with connection.schema_editor() as schema_editor:
schema_editor.delete_model(MyModel)
Его необходимо использовать через контекстный менеджер, поскольку это позволяет ему управлять такими вещами, как транзакции и отложенный SQL (например, создание ограничений «ForeignKey»).
Он предоставляет все возможные операции как методы, которые следует вызывать в том порядке, в котором вы хотите применить изменения. Некоторые возможные операции или типы изменений возможны не во всех базах данных — например, MyISAM не поддерживает ограничения внешнего ключа.
Если вы пишете или поддерживаете стороннюю базу данных для Django, вам потребуется предоставить реализацию SchemaEditor для работы с функциями миграции Django - однако, пока ваша база данных относительно стандартна в использовании SQL и реляционном проектировании, вы должны иметь возможность создать подкласс одного из встроенных классов Django SchemaEditor и немного настроить синтаксис.
Методы¶
выполнить()¶
- BaseDatabaseSchemaEditor.execute(sql, params=[])¶
Выполняет переданный оператор SQL с параметрами, если они указаны. Это оболочка обычных курсоров базы данных, которая позволяет по желанию пользователя записывать SQL в файл .sql.
create_model()¶
- BaseDatabaseSchemaEditor.create_model(model)¶
Создает новую таблицу в базе данных для предоставленной модели вместе со всеми необходимыми уникальными ограничениями или индексами.
delete_model()¶
- BaseDatabaseSchemaEditor.delete_model(model)¶
Удаляет таблицу модели в базе данных вместе со всеми имеющимися у нее уникальными ограничениями или индексами.
add_index()¶
- BaseDatabaseSchemaEditor.add_index(model, index)¶
Добавляет индекс в таблицу модели.
remove_index()¶
- BaseDatabaseSchemaEditor.remove_index(model, index)¶
Удаляет индекс из таблицы модели.
add_constraint()¶
- BaseDatabaseSchemaEditor.add_constraint(model, constraint)¶
Добавляет ограничение в таблицу модели.
remove_constraint()¶
- BaseDatabaseSchemaEditor.remove_constraint(model, constraint)¶
Удаляет ограничение из таблицы модели.
alter_unique_together()¶
- BaseDatabaseSchemaEditor.alter_unique_together(model, old_unique_together, new_unique_together)¶
Изменяет значение unique_together модели; это будет добавлять или удалять уникальные ограничения из таблицы модели, пока они не будут соответствовать новому значению.
alter_index_together()¶
- BaseDatabaseSchemaEditor.alter_index_together(model, old_index_together, new_index_together)¶
Changes a model’s index_together value; this
will add or remove indexes from the model’s table until they match the new
value.
alter_db_table()¶
- BaseDatabaseSchemaEditor.alter_db_table(model, old_db_table, new_db_table)¶
Переименовывает таблицу модели с old_db_table на new_db_table.
alter_db_tablespace()¶
- BaseDatabaseSchemaEditor.alter_db_tablespace(model, old_db_tablespace, new_db_tablespace)¶
Перемещает таблицу модели из одного табличного пространства в другое.
add_field()¶
- BaseDatabaseSchemaEditor.add_field(model, field)¶
Добавляет столбец (или иногда несколько) в таблицу модели для представления поля. Это также добавит индексы или ограничение уникальности, если поле имеет db_index=True или unique=True.
Если поле представляет собой «ManyToManyField» без значения «through», вместо создания столбца будет создана таблица для представления связи. Если указан through, это не операция.
Если поле является «ForeignKey», это также добавит ограничение внешнего ключа в столбец.
remove_field()¶
- BaseDatabaseSchemaEditor.remove_field(model, field)¶
Удаляет столбцы, представляющие поле, из таблицы модели вместе со всеми ограничениями уникальности, ограничениями внешнего ключа или индексами, вызванными этим полем.
Если поле представляет собой ManyToManyField без значения «through», оно удалит таблицу, созданную для отслеживания связи. Если указан through, это не операция.
alter_field()¶
- BaseDatabaseSchemaEditor.alter_field(model, old_field, new_field, strict=False)¶
Это преобразует поле модели из старого поля в новое. Сюда входит изменение имени столбца (атрибут db_column), изменение типа поля (если изменяется класс поля), изменение статуса поля NULL, добавление или удаление уникальных ограничений и индексов только для поля, изменение первичного ключа и изменение назначения ограничений ForeignKey.
Наиболее распространенное преобразование, которое это не может сделать, — это преобразование «ManyToManyField» в обычное поле или наоборот; Django не может сделать это без потери данных и поэтому откажется это сделать. Вместо этого remove_field() и add_field() следует вызывать отдельно.
Если в базе данных есть «supports_combined_alters», Django попытается выполнить как можно больше из них за один вызов базы данных; в противном случае он будет выдавать отдельный оператор ALTER для каждого изменения, но не будет выдавать ALTER, если никаких изменений не требуется.
Атрибуты¶
Все атрибуты следует рассматривать как доступные только для чтения, если не указано иное.
соединение¶
- SchemaEditor.connection¶
Объект подключения к базе данных. Полезным атрибутом соединения является «псевдоним», который можно использовать для определения имени базы данных, к которой осуществляется доступ.
Это полезно при миграции данных для миграции с несколькими базами данных.