SchemaEditor

класс 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 и реляционного дизайна, у вас должна быть возможность создать подкласс одного из встроенных SchemaEditorклассов Django и немного настроить синтаксис.

Методы

execute()

BaseDatabaseSchemaEditor.execute( sql , params = [] )

Выполняет переданный оператор SQL с параметрами, если они указаны. Это оболочка вокруг обычных курсоров базы данных, которая позволяет записывать SQL в .sqlфайл, если пользователь желает.

create_model()

BaseDatabaseSchemaEditor.create_model( модель )

Создает новую таблицу в базе данных для предоставленной модели вместе со всеми необходимыми уникальными ограничениями или индексами.

delete_model()

BaseDatabaseSchemaEditor.delete_model( модель )

Удаляет таблицу модели в базу данных вместе со всеми имеющимися у нее уникальными ограничениями или индексами.

add_index()

BaseDatabaseSchemaEditor.add_index( модель , индекс )

Добавляет indexв modelтаблицу.

remove_index()

BaseDatabaseSchemaEditor.remove_index( модель , индекс )

Удаляет indexиз modelтаблицы.

add_constraint()

BaseDatabaseSchemaEditor.add_constraint( модель , ограничение )

Добавляет constraintв modelтаблицу.

remove_constraint()

BaseDatabaseSchemaEditor.remove_constraint( модель , ограничение )

Удаляет constraintиз modelтаблицы.

alter_unique_together()

BaseDatabaseSchemaEditor.alter_unique_together( модель , старая_уникальная_ совокупная , новая_уникальная_ совокупная )

Изменяет unique_togetherстоимость модели ; это добавит или удалит уникальные ограничения из таблицы модели, пока они не совпадут с новым значением.

alter_index_together()

BaseDatabaseSchemaEditor.alter_index_together( модель , старый_индекс_ совокупно , новый_индекс_ совокупно )

Изменяет index_togetherстоимость модели ; это добавит или удалит индексы из таблицы модели, пока они не совпадут с новым значением.

alter_db_table()

BaseDatabaseSchemaEditor.alter_db_table( модель , old_db_table , new_db_table )

Переименовывает таблицу модели с old_db_tableна new_db_table.

alter_db_tablespace()

BaseDatabaseSchemaEditor.alter_db_tablespace( модель , old_db_tablespace , new_db_tablespace )

Перемещает таблицу модели из одного табличного пространства в другое.

add_field()

BaseDatabaseSchemaEditor.add_field( модель , поле )

Добавляет столбец (или иногда несколько) в таблицу модели для представления поля. Это также добавит индексы или уникальное ограничение, если в поле есть db_index=Trueили unique=True.

Если поле ManyToManyFieldне имеет значения through, вместо создания столбца будет создана таблица для представления взаимосвязи. Если throughпредоставляется, это не работает.

Если это поле ForeignKey, это также добавит ограничение внешнего ключа в столбец.

remove_field()

BaseDatabaseSchemaEditor.remove_field( модель , поле )

Удаляет столбцы, представляющие поле из таблицы модели, вместе с любыми уникальными ограничениями, ограничениями внешнего ключа или индексами, вызванными этим полем.

Если поле является ManyToManyField без значения для through, оно удалит таблицу, созданную для отслеживания взаимосвязи. Если throughпредоставляется, это не работает.

alter_field()

BaseDatabaseSchemaEditor.alter_field( модель , старое_филд , новое_филд , строгое = Ложь )

Это преобразует поле модели из старого поля в новое. Это включает в себя изменение имени столбца ( db_columnатрибута), изменение типа поля (если изменяется класс поля), изменение NULLстатуса поля, добавление или удаление уникальных ограничений и индексов только для поля, изменение первичного ключа и изменение назначения ForeignKeyограничений.

Наиболее распространенное преобразование, которое это не может сделать, - это преобразование a ManyToManyFieldв нормальное поле или наоборот; Django не может сделать это без потери данных, поэтому он откажется это сделать. Вместо этого remove_field()и add_field()следует называть отдельно.

Если база данных имеет supports_combined_alters, Django попытается выполнить как можно больше из них за один вызов базы данных; в противном случае он будет выдавать отдельный оператор ALTER для каждого изменения, но не будет выдавать ALTER, если никаких изменений не требуется.

Атрибуты

Все атрибуты должны считаться доступными только для чтения, если не указано иное.

connection

SchemaEditor.connection

Объект подключения к базе данных. Полезный атрибут соединения, aliasкоторый можно использовать для определения имени базы данных, к которой осуществляется доступ.

Это полезно при выполнении миграции данных для миграции с несколькими базами данных .

Copyright ©2021 All rights reserved