Spec-Zone.ru › Django 2.0

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]
Новое в Django 1.11.

Добавляет index к таблице model.

remove_index()

BaseDatabaseSchemaEditor.remove_index(model, index) [source]
Новое в Django 1.11.

Удаляет 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.0/ref/schema-editor/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API