SchemaEditor


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 и немного подправить синтаксис.

Методы
execute()
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)[исходный код]
Добавляет index в таблицу model.

remove_index()
BaseDatabaseSchemaEditor.remove_index(model, index)[исходный код]
Удаляет index из таблицы model.

add_constraint()
BaseDatabaseSchemaEditor.add_constraint(model, constraint)[исходный код]
Добавляет constraint в таблицу model.

remove_constraint()
BaseDatabaseSchemaEditor.remove_constraint(model, constraint)[исходный код]
Удаляет constraint из таблицы model.

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)[исходный код]
Изменяет значение index_together модели; при этом добавляются или удаляются индексы из таблицы модели, пока они не будут соответствовать новому значению.

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 там, где изменения не требуются.

Атрибуты
Все атрибуты должны считаться доступными только для чтения, если не указано иное.

connection
SchemaEditor.connection
Объект соединения с базой данных. Полезным атрибутом соединения является alias, который может быть использован для определения имени базы данных, к которой осуществляется доступ.

Это полезно при выполнении миграции данных для migrations with multiple databases.