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 для работы с функциональностью миграций 1.7 — однако, если ваша база данных относительно стандартна в использовании SQL и реляционной модели, вы сможете унаследовать один из встроенных классов Django SchemaEditor и немного изменить синтаксис. Также обратите внимание, что есть несколько новых функций базы данных, которые будут искать миграции: can_rollback_ddl и supports_combined_alters являются самыми важными.
Методы
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.0/ref/schema-editor/