SchemaEditor
-
class BaseDatabaseSchemaEditor[source]
Система миграций Django разделена на две части; логика для расчёта и хранения операций, которые должны быть выполнены (django.db.migrations), и уровень абстракции базы данных, который преобразует такие действия, как «создание модели» или «удаление поля», в SQL-запросы — именно эта задача выполняется SchemaEditor.
Вероятность того, что вам, как обычному разработчику Django, потребуется напрямую взаимодействовать с SchemaEditor, невелика, но если вы хотите создать собственную систему миграций или у вас есть более сложные потребности, это намного удобнее, чем писать SQL.
Каждый бэкенд базы данных в Django предоставляет собственную версию SchemaEditor, и к ней всегда можно получить доступ через менеджер контекста connection.schema_editor():
with connection.schema_editor() as schema_editor:
schema_editor.delete_model(MyModel)
Её необходимо использовать через менеджер контекста, так как это позволяет управлять такими вещами, как транзакции и отложенные SQL-запросы (например, создание ForeignKey ограничений).
Она предоставляет все возможные операции в виде методов, которые должны вызываться в том порядке, в котором вы хотите применить изменения. Некоторые возможные операции или типы изменений недоступны для всех баз данных — например, MyISAM не поддерживает ограничения внешнего ключа.
Если вы пишете или поддерживаете сторонний бэкенд базы данных для Django, вам необходимо предоставить реализацию SchemaEditor для работы с функциональностью миграций версии 1.7 — однако, если ваша база данных относительно стандартно использует SQL и реляционную модель, вы сможете унаследовать один из встроенных классов Django SchemaEditor и немного изменить синтаксис. Также обратите внимание, что миграции будут искать несколько новых функций базы данных: can_rollback_ddl и supports_combined_alters являются наиболее важными.
Методы
execute()
-
BaseDatabaseSchemaEditor.execute(sql, params=[])[source]
Выполняет переданный SQL-запрос с параметрами, если они указаны. Это простой обертка над обычными курсорами базы данных, которая позволяет захватить SQL в файл .sql по желанию пользователя.
create_model()
-
BaseDatabaseSchemaEditor.create_model(model)[source]
Создаёт новую таблицу в базе данных для указанной модели, а также все необходимые уникальные ограничения или индексы.
delete_model()
-
BaseDatabaseSchemaEditor.delete_model(model)[source]
Удаляет таблицу модели в базе данных вместе с любыми уникальными ограничениями или индексами, которые к ней относятся.
add_index()
-
BaseDatabaseSchemaEditor.add_index(model, index)[source]
Добавляет index к таблице model.
remove_index()
-
BaseDatabaseSchemaEditor.remove_index(model, index)[source]
Удаляет index из таблицы model.
alter_unique_together()
-
BaseDatabaseSchemaEditor.alter_unique_together(model, old_unique_together, new_unique_together)[source]
Изменяет значение unique_together модели; это добавит или удалит уникальные ограничения из таблицы модели до тех пор, пока они не будут соответствовать новому значению.
alter_index_together()
-
BaseDatabaseSchemaEditor.alter_index_together(model, old_index_together, new_index_together)[source]
Изменяет значение index_together модели; это добавит или удалит индексы из таблицы модели до тех пор, пока они не будут соответствовать новому значению.
alter_db_table()
-
BaseDatabaseSchemaEditor.alter_db_table(model, old_db_table, new_db_table)[source]
Переименовывает таблицу модели с old_db_table на new_db_table.
alter_db_tablespace()
-
BaseDatabaseSchemaEditor.alter_db_tablespace(model, old_db_tablespace, new_db_tablespace)[source]
Перемещает таблицу модели из одного пространства таблиц в другое.
add_field()
-
BaseDatabaseSchemaEditor.add_field(model, field)[source]
Добавляет столбец (или несколько столбцов) в таблицу модели для представления поля. Также добавит индексы или уникальное ограничение, если у поля есть db_index=True или unique=True.
Если поле является ManyToManyField без значения для through, вместо создания столбца, создаст таблицу для представления связи. Если through указано, это бесполезно.
Если поле является ForeignKey, это также добавит ограничение внешнего ключа к столбцу.
remove_field()
-
BaseDatabaseSchemaEditor.remove_field(model, field)[source]
Удаляет столбец(ы), представляющие поле из таблицы модели, а также любые уникальные ограничения, ограничения внешнего ключа или индексы, вызванные этим полем.
Если поле является ManyToManyField без значения для through, оно удалит таблицу, созданную для отслеживания связи. Если through указано, это бесполезно.
alter_field()
-
BaseDatabaseSchemaEditor.alter_field(model, old_field, new_field, strict=False)[source]
Преобразует поле в модели со старого поля на новое. Это включает изменение имени столбца (атрибута db_column), изменение типа поля (если меняется класс поля), изменение статуса поля NULL, добавление или удаление уникальных ограничений и индексов, связанных только с полем, изменение первичного ключа и изменение назначения ограничений ForeignKey.
Наиболее распространённое преобразование, которое она не может выполнить — преобразование ManyToManyField в обычное поле или наоборот; Django не может это сделать без потери данных, и поэтому откажется это сделать. Вместо этого следует вызвать remove_field() и add_field() по отдельности.
Если база данных имеет supports_combined_alters, Django попытается выполнить как можно больше из этих операций в одном запросе к базе данных; в противном случае он выпустит отдельный оператор ALTER для каждого изменения, но не выпустит ALTER, где изменения не требуются (как часто делал South).
Атрибуты
Все атрибуты должны считаться только для чтения, если не указано иное.
connection
-
SchemaEditor.connection
Объект соединения с базой данных. Полезный атрибут соединения — alias, который можно использовать для определения имени базы данных, к которой осуществляется доступ.
Это полезно при выполнении миграций данных для миграций с несколькими базами данных.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.1/ref/schema-editor/