SchemaEditor

BaseDatabaseSchemaEditor[source]

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实现以使用1.7的迁移功能 - 但是,只要您的数据库相对标准的使用SQL和关系设计,你应该能够继承一个内置的Django SchemaEditor类,只是稍微调整语法。 另请注意,迁移将会寻找一些新的数据库功能:can_rollback_ddlsupports_combined_alters是最重要的。

方法¶ T0>

execute()

BaseDatabaseSchemaEditor。执行sqlparams = [[source]

使用参数(如果提供)执行传入的SQL语句。 这是普通数据库游标的一个简单包装,它允许如果用户希望将SQL捕获到.sql文件。

create_model()

BaseDatabaseSchemaEditor。create_model(model)[source]

在数据库中为所提供的模型创建一个新表,以及它需要的任何唯一约束或索引。

delete_model()

BaseDatabaseSchemaEditor。delete_model(model)[source]

将数据库中的模型表与其具有的唯一约束或索引一起删除。

add_index()

BaseDatabaseSchemaEditor。add_indexmodelindex[source]
Django 1.11新增功能

index添加到model的表中。

remove_index()

BaseDatabaseSchemaEditor。remove_indexmodelindex[source]
Django 1.11新增功能

model的表中删除index

alter_unique_together()

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

更改模型的unique_together值;这将添加或删除模型表中的唯一约束,直到它们与新值相匹配。

alter_index_together()

BaseDatabaseSchemaEditor。alter_index_togethermodelold_index_togethernew_index_together[source] T6>

更改模型的index_together值;这将添加或删除模型表中的索引,直到匹配新值。

alter_db_table()

BaseDatabaseSchemaEditor。alter_db_tablemodelold_db_tablenew_db_table[source] T6>

将模型的表从old_db_table重命名为new_db_table

alter_db_tablespace()

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

将模型的表从一个表空间移动到另一个表空间。

add_field()

BaseDatabaseSchemaEditor。add_fieldmodelfield[source]

向模型的表中添加一列(或者有时是多个)来表示字段。 如果该字段具有db_index=Trueunique=True,这也将添加索引或唯一约束。

如果该字段是ManyToManyField,而没有through的值,则不会创建列,而是创建一个表来表示关系。 如果提供了through,则它是无操作的。

如果该字段是一个ForeignKey,那么这也会将外键约束添加到该列。

remove_field()

BaseDatabaseSchemaEditor。remove_fieldmodelfield[source]

从模型的表中删除表示字段的列,以及由该字段引起的任何唯一约束,外键约束或索引。

如果该字段是一个没有through值的ManyToManyField,它将删除为跟踪关系而创建的表。 如果提供了through,则它是无操作的。

alter_field()

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

这将模型上的字段从旧字段转换为新字段。 这包括更改列的名称(db_column属性),更改字段的类型(如果字段类更改),更改字段的NULL状态,添加或删除仅字段唯一约束和索引,更改主键和更改ForeignKey

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.

如果数据库具有supports_combined_alters,Django将尝试尽可能多地在单个数据库调用中执行这些操作;否则,它将为每个更改发出一个单独的ALTER语句,但不会发出不需要更改的ALTER(正如South经常所做的那样)。

属性¶ T0>

除非另有说明,否则所有属性均应视为只读。

connection

SchemaEditor。连接 T0> ¶ T1>

连接对象到数据库。 连接的一个有用属性是alias,它可以用来确定被访问的数据库的名称。

migrations with multiple databases进行数据迁移时,这非常有用。