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