Spec-Zone.ru › Django 4.1

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.

rename_index()

Новая функция в Django 4.1.
BaseDatabaseSchemaEditor.rename_index(model, old_index, new_index)

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

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/4.1/ref/schema-editor/

Spec-Zone.ru

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