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 в обычное поле Field или наоборот: 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/6.0/ref/schema-editor/