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 для работы с функциональностью миграций версии 1.7. Однако, если ваша база данных в целом использует стандартные SQL и реляционную модель, вы можете унаследовать один из встроенных классов Django SchemaEditor и немного изменить синтаксис. Обратите также внимание, что есть несколько новых функций баз данных, которые миграции будут искать: can_rollback_ddl и supports_combined_alters — самые важные.
Методы
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.
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_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, где изменения не требуются (как часто делал South).
Атрибуты
Все атрибуты следует считать только для чтения, если не указано иное.
connection
-
SchemaEditor.connection
Объект подключения к базе данных. Полезным атрибутом подключения является alias, который можно использовать для определения имени базы данных, к которой осуществляется доступ.
Это полезно при выполнении миграций данных для миграций с несколькими базами данных.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.2/ref/schema-editor/