Skip to main content

SchemaEditor

class BaseDatabaseSchemaEditor[源代码]

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

它将所有可能的操作公开为方法,应按您希望应用更改的顺序调用。一些可能的操作或更改类型不可能在所有数据库上 - 例如,MyISAM不支持外键约束。

如果您正在为Django编写或维护第三方数据库后端,则需要提供 SchemaEditor 实现,以便使用1.7的迁移功能 - 但是,只要您的数据库在使用SQL时相对标准,关系设计,你应该能够子类化一个内置的Django SchemaEditor 类,并且只是稍微调整语法。另请注意,迁移将查找一些新的数据库功能:can_rollback_ddlsupports_combined_alters 是最重要的。

方法

execute()

BaseDatabaseSchemaEditor.execute(sql, params=[])[源代码]

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

create_model()

BaseDatabaseSchemaEditor.create_model(model)[源代码]

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

delete_model()

BaseDatabaseSchemaEditor.delete_model(model)[源代码]

删除数据库中的模型表及其具有的任何唯一约束或索引。

alter_unique_together()

BaseDatabaseSchemaEditor.alter_unique_together(model, old_unique_together, new_unique_together)[源代码]

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

alter_index_together()

BaseDatabaseSchemaEditor.alter_index_together(model, old_index_together, new_index_together)[源代码]

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

alter_db_table()

BaseDatabaseSchemaEditor.alter_db_table(model, old_db_table, new_db_table)[源代码]

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

alter_db_tablespace()

BaseDatabaseSchemaEditor.alter_db_tablespace(model, old_db_tablespace, new_db_tablespace)[源代码]

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

add_field()

BaseDatabaseSchemaEditor.add_field(model, field)[源代码]

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

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

如果字段是 ForeignKey,这也将向列添加外键约束。

remove_field()

BaseDatabaseSchemaEditor.remove_field(model, field)[源代码]

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

如果字段是没有 through 值的ManyToManyField,它将删除创建的表以跟踪关系。如果提供 through,它是无操作。

alter_field()

BaseDatabaseSchemaEditor.alter_field(model, old_field, new_field, strict=False)[源代码]

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

这个不能做的最常见的转换是将 ManyToManyField 转换为正常字段,反之亦然; Django不能这样做而不丢失数据,所以它会拒绝这样做。相反,应单独调用 remove_field()add_field()

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

属性

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

connection

SchemaEditor.connection

到数据库的连接对象。连接的有用属性是 alias,可用于确定正在访问的数据库的名称。

这在为 迁移与多个数据库 执行数据迁移时非常有用。