SchemaEditor
¶
-
class
BaseDatabaseSchemaEditor
¶
Система миграции Django состоит из двух частей: логика для вычисления и хранения того, какие операции должны быть выполнены (django.db.migrations
), и слой абстракции базы данных, который превращает такие вещи, как «создать модель» или «удалить поле» в SQL - что является задачей SchemaEditor
.
Вряд ли вы захотите напрямую взаимодействовать с SchemaEditor
как обычный разработчик, использующий Django, но если вы хотите написать свою собственную систему миграции или имеете более сложные потребности, это гораздо приятнее, чем писать 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)¶
Удаляет таблицу модели в базе данных вместе с любыми уникальными ограничениями или индексами, которые она имеет.
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
, который может быть использован для определения имени базы данных, к которой осуществляется доступ.
Это полезно при выполнении миграции данных для migrations with multiple databases.