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 实现才能与 Django 的迁移功能一起使用。但是,只要您的数据库在使用 SQL 和关系设计方面相对标准,您就可以对 Django 内置的 SchemaEditor 类之一进行子类化,并稍微调整语法。

方法

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

rename_index()

BaseDatabaseSchemaEditor.rename_index(model, old_index, new_index)

model 的表中的 old_index 重命名为 new_index

add_constraint()

BaseDatabaseSchemaEditor.add_constraint(model, constraint)

constraint 添加到 model 的表中。

remove_constraint()

BaseDatabaseSchemaEditor.remove_constraint(model, constraint)

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_table_comment()

Django 4.2 中的新功能。
BaseDatabaseSchemaEditor.alter_db_table_comment(model, old_db_table_comment, new_db_table_comment)

model 的表注释更改为 new_db_table_comment

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)

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

如果该字段是 ManyToManyFieldthrough 没有值,它将删除创建的用于跟踪关系的表。如果提供了 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,它可用于确定正在访问的数据库的名称。

这在对 具有多个数据库的迁移 进行数据迁移时很有用。

返回顶部