SchemaEditor
-
class BaseDatabaseSchemaEditor
Система миграций Django разделена на две части; логика для расчета и хранения операций, которые должны быть выполнены (django.db.migrations), и уровень абстракции базы данных, который преобразует такие действия, как «создание модели» или «удаление поля», в SQL — это задача SchemaEditor.
Вряд ли вам, как обычному разработчику Django, потребуется взаимодействовать напрямую с SchemaEditor, но если вы хотите создать собственную систему миграций или у вас есть более сложные потребности, это намного удобнее, чем писать SQL.
Каждый бэкэнд базы данных в Django предоставляет свою версию SchemaEditor, и к ней всегда можно получить доступ через менеджер контекста:
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()
-
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_table_comment()
-
BaseDatabaseSchemaEditor.alter_db_table_comment(model, old_db_table_comment, new_db_table_comment)
Изменяет комментарий к таблице model на new_db_table_comment.
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.2/ref/schema-editor/