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约束)。

It exposes all possible operations as methods, that should be called in the order you wish changes to be applied. Some possible operations or types of change are not possible on all databases - for example, MyISAM does not support foreign key constraints.

If you are writing or maintaining a third-party database backend for Django, you will need to provide a SchemaEditor implementation in order to work with 1.7’s migration functionality - however, as long as your database is relatively standard in its use of SQL and relational design, you should be able to subclass one of the built-in Django SchemaEditor classes and just tweak the syntax a little. Also note that there are a few new database features that migrations will look for: can_rollback_ddl and supports_combined_alters are the most important.

Methods

execute()

BaseDatabaseSchemaEditor.execute(sql, params=[])[source]

Executes the SQL statement passed in, with parameters if supplied. This is a simple wrapper around the normal database cursors that allows capture of the SQL to a .sql file if the user wishes.

create_model()

BaseDatabaseSchemaEditor.create_model(model)[source]

Creates a new table in the database for the provided model, along with any unique constraints or indexes it requires.

delete_model()

BaseDatabaseSchemaEditor.delete_model(model)[source]

Drops the model’s table in the database along with any unique constraints or indexes it has.

add_index()

BaseDatabaseSchemaEditor.add_index(model, index)[source]
New in Django 1.11.

Adds index to model’s table.

remove_index()

BaseDatabaseSchemaEditor.remove_index(model, index)[source]
New in Django 1.11.

Removes index from model’s table.

alter_unique_together()

BaseDatabaseSchemaEditor.alter_unique_together(model, old_unique_together, new_unique_together)[source]

Changes a model’s unique_together value; this will add or remove unique constraints from the model’s table until they match the new value.

alter_index_together()

BaseDatabaseSchemaEditor.alter_index_together(model, old_index_together, new_index_together)[source]

Changes a model’s index_together value; this will add or remove indexes from the model’s table until they match the new value.

alter_db_table()

BaseDatabaseSchemaEditor.alter_db_table(model, old_db_table, new_db_table)[source]

Renames the model’s table from old_db_table to new_db_table.

alter_db_tablespace()

BaseDatabaseSchemaEditor.alter_db_tablespace(model, old_db_tablespace, new_db_tablespace)[source]

Moves the model’s table from one tablespace to another.

add_field()

BaseDatabaseSchemaEditor.add_field(model, field)[source]

Adds a column (or sometimes multiple) to the model’s table to represent the field. This will also add indexes or a unique constraint if the field has db_index=True or unique=True.

If the field is a ManyToManyField without a value for through, instead of creating a column, it will make a table to represent the relationship. If through is provided, it is a no-op.

If the field is a ForeignKey, this will also add the foreign key constraint to the column.

remove_field()

BaseDatabaseSchemaEditor.remove_field(model, field)[source]

Removes the column(s) representing the field from the model’s table, along with any unique constraints, foreign key constraints, or indexes caused by that field.

If the field is a ManyToManyField without a value for through, it will remove the table created to track the relationship. If through is provided, it is a no-op.

alter_field()

BaseDatabaseSchemaEditor.alter_field(model, old_field, new_field, strict=False)[source]

This transforms the field on the model from the old field to the new one. This includes changing the name of the column (the db_column attribute), changing the type of the field (if the field class changes), changing the NULL status of the field, adding or removing field-only unique constraints and indexes, changing primary key, and changing the destination of ForeignKey constraints.

The most common transformation this cannot do is transforming a ManyToManyField into a normal Field or vice-versa; Django cannot do this without losing data, and so it will refuse to do it. Instead, remove_field() and add_field() should be called separately.

If the database has the supports_combined_alters, Django will try and do as many of these in a single database call as possible; otherwise, it will issue a separate ALTER statement for each change, but will not issue ALTERs where no change is required (as South often did).

Attributes

All attributes should be considered read-only unless stated otherwise.

connection

SchemaEditor.connection

A connection object to the database. A useful attribute of the connection is alias which can be used to determine the name of the database being accessed.

This is useful when doing data migrations for migrations with multiple databases.