Spec-Zone.ru › Django 5.1

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 для работы с функциональностью миграций Django. Однако, если ваша база данных относительно стандартна в использовании SQL и реляционной модели, вы сможете унаследовать один из встроенных Django-классов SchemaEditor и немного подкорректировать синтаксис.

Методы

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.

rename_index()

BaseDatabaseSchemaEditor.rename_index(model, old_index, new_index) [source]

Переименовывает old_index из таблицы model в new_index.

add_constraint()

BaseDatabaseSchemaEditor.add_constraint(model, constraint) [source]

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

remove_constraint()

BaseDatabaseSchemaEditor.remove_constraint(model, constraint) [source]

Удаляет constraint из таблицы 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_table_comment()

BaseDatabaseSchemaEditor.alter_db_table_comment(model, old_db_table_comment, new_db_table_comment) [source]

Изменяет комментарий к таблице model на new_db_table_comment.

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

Атрибуты

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

connection

SchemaEditor.connection

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

Это полезно при выполнении миграций данных для миграций с несколькими базами данных.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.1/ref/schema-editor/

Spec-Zone.ru

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