Spec-Zone.ru › Django 3.2

SchemaEditor

class BaseDatabaseSchemaEditor

Система миграций 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=[])

Выполняет переданный 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, который можно использовать для определения имени базы данных, к которой происходит доступ.

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

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

Spec-Zone.ru

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