Spec-Zone.ru › Django 4.0

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

Spec-Zone.ru

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