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()
-
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/5.0/ref/schema-editor/