Spec-Zone.ru › Django 5.2

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

Spec-Zone.ru

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