SchemaEditor

BaseDatabaseSchemaEditor[source]

Django的迁移系统分为两部分:用于计算和存储应运行哪些操作(django.db.migrations)的逻辑,以及将数据库抽象层转换为SQL的“创建模型”或“删除字段”是SchemaEditor的工作。

你可能并不想像一个普通的开发者使用Django那样,直接和SchemaEditor进行交互,但是如果你编写自己的迁移系统,或者有更进一步的需求,这样会比编写SQL语句更方便。

每个Django的数据库后端都提供了它们自己的SchemaEditor,并且总是可以通过connection.schema_editor()上下文管理器来访问。

with 连接.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_togethermodelold_unique_togethernew_unique_together[source] T6>

更改模型的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_tablespacemodelold_db_tablespacenew_db_tablespace[source] T6>

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

add_field()

BaseDatabaseSchemaEditor。add_fieldmodelfield[source]

向模型的表中添加一列(或者有时几列),表示新增的字段。 如果该字段带有db_index=True或者 unique=True,同时会添加索引或者唯一性约束。

如果字段为ManyToManyField并且缺少 through值,会创建一个表来表示关系,而不是创建一列。 如果提供了through值,就什么也不做。

如果字段为ForeignKey,同时会向列上添加一个外键约束。

remove_field()

BaseDatabaseSchemaEditor。remove_fieldmodelfield[source]

从模型的表中移除代表字段的列,以及列上的任何唯一性约束,外键约束,或者索引。

如果字段是ManyToManyField并且缺少through值,会移除创建用来跟踪关系的表。 如果提供了through值,就什么也不做。

alter_field()

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

这会将模型的字段从旧的字段转换为新的。 这包括列名称的修改(db_column属性)、字段类型的修改(如果修改了字段类)、字段NULL状态的修改、添加或者删除字段层面的唯一性约束和索引、修改主键、以及修改ForeignKey约束的目标。

最常见的转换是将ManyToManyField转换为正常的字段,反之亦然; Django无法在不丢失数据的情况下执行此操作,因此它将拒绝这样做。 作为替代,应该单独调用remove_field()add_field()

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

属性¶ T0>

除非另有规定,所有属性都应该是只读的。

connection

SchemaEditor。连接 T0> ¶ T1>

一个到数据库的连接对象。 alias是connection的一个实用的属性,它用于决定要访问的数据库的名字。

当你migrations with multiple databases的时候,这是非常有用的。