SchemaEditor

класс BaseDatabaseSchemaEditor

Система миграции Django разделена на две части: логика для расчета и хранения операций для выполнения ( django.db.migrations ) и уровень абстракции базы данных, который преобразует такие вещи, как «построить модель» или «удалить». поле 'в коде SQL, за которое отвечает SchemaEditor .

SchemaEditor Как обычный разработчик Django, вам вряд ли придется напрямую взаимодействовать с экземпляром , но если вы хотите написать свою собственную систему миграции или у вас есть более сложные потребности, это намного лучше, чем необходимость написать код SQL.

Движок базы данных Chae в Django предоставляет свою собственную версию SchemaEditor , которая всегда доступна через диспетчер контекста connection.schema_editor() :

with connection.schema_editor() as schema_editor:
    schema_editor.delete_model(MyModel)

Его следует использовать через диспетчер контекста, поскольку он помогает обрабатывать такие вещи, как транзакции и отложенный код SQL (например, создание ограничений внешнего ключа).

Этот редактор предоставляет все возможные операции в виде методов, которые необходимо вызывать в желаемом порядке применения изменений. Некоторые операции или типы модификации не всегда возможны в зависимости от базы данных; например, механизм MySQL MyISAM не обрабатывает ограничения внешнего ключа.

Если вы пишете или обслуживаете ядро ​​базы данных вне кода Django, вам нужно будет предоставить реализацию SchemaEditor для поддержки функций миграции, доступных в Django 1.7. Однако, если рассматриваемая база данных в целом соответствует стандартам SQL и реляционного дизайна, должна существовать возможность наследования от одного SchemaEditor из классов Django и незначительной настройки синтаксиса. Также обратите внимание, что миграции будут относиться к некоторым DatabaseFeatures функциям базы данных (классов ), включая флаги can_rollback_ddl и supports_combined_alters .

Методы

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 и unique поля.

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

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

remove_field()

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

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

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

alter_field()

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

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

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

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

Атрибуты

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

connection

SchemaEditor.connection

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

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

Copyright ©2020 All rights reserved