SchemaEditor — Django 文档

来自菜鸟教程
Django/docs/2.2.x/ref/schema-editor
跳转至:导航、​搜索

SchemaEditor

class BaseDatabaseSchemaEditor

Django 的迁移系统分为两部分; 计算和存储应该运行哪些操作的逻辑(django.db.migrations),以及将“创建模型”或“删除字段”等内容转换为 SQL 的数据库抽象层 - 这是 [ X262X]。

作为一个使用 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)

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


add_index()

BaseDatabaseSchemaEditor.add_index(model, index)

index 添加到 model 的表格中。


remove_index()

BaseDatabaseSchemaEditor.remove_index(model, index)

model 的表格中移除 index


add_constraint()

BaseDatabaseSchemaEditor.add_constraint(model, constraint)

2.2 版中的新功能。


constraint 添加到 model 的表格中。


remove_constraint()

BaseDatabaseSchemaEditor.remove_constraint(model, constraint)

2.2 版中的新功能。


model 的表格中移除 constraint


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,这也将添加索引或唯一约束。

如果字段是 ManyToManyField 而没有 through 的值,则不会创建列,而是创建一个表来表示关系。 如果提供 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 状态、添加或删除field-only 唯一约束和索引,更改主键,以及更改 ForeignKey 约束的目标。

这不能做的最常见的转换是将 ManyToManyField 转换为普通字段,反之亦然; Django 无法在不丢失数据的情况下执行此操作,因此它会拒绝执行此操作。 相反,应分别调用 remove_field()add_field()

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


属性

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

connection

SchemaEditor.connection

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

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