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]
Удаляет таблицу модели в базе данных вместе с любыми уникальными ограничениями или индексами, которые она имеет.
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.10/ref/schema-editor/