SchemaEditor

class BaseDatabaseSchemaEditor[source]

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=())[source]

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

create_model()

BaseDatabaseSchemaEditor.create_model(model)[source]

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

delete_model()

BaseDatabaseSchemaEditor.delete_model(model)[source]

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

add_index()

BaseDatabaseSchemaEditor.add_index(model, index)[source]

index 添加到 model 的表中。

remove_index()

BaseDatabaseSchemaEditor.remove_index(model, index)[source]

model 的表中删除 index

rename_index()

BaseDatabaseSchemaEditor.rename_index(model, old_index, new_index)[source]

model 表中的 old_index 重命名为 new_index

add_constraint()

BaseDatabaseSchemaEditor.add_constraint(model, constraint)[source]

constraint 添加到 model 的表中。

remove_constraint()

BaseDatabaseSchemaEditor.remove_constraint(model, constraint)[source]

model 的表中删除 constraint

alter_unique_together()

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

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

alter_index_together()

BaseDatabaseSchemaEditor.alter_index_together(model, old_index_together, new_index_together)[source]

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

alter_db_table()

BaseDatabaseSchemaEditor.alter_db_table(model, old_db_table, new_db_table)[source]

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

alter_db_table_comment()

BaseDatabaseSchemaEditor.alter_db_table_comment(model, old_db_table_comment, new_db_table_comment)[source]

model 的表注释更改为 new_db_table_comment

alter_db_tablespace()

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

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

add_field()

BaseDatabaseSchemaEditor.add_field(model, field)[source]

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

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

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

remove_field()

BaseDatabaseSchemaEditor.remove_field(model, field)[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。

属性

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

connection

SchemaEditor.connection

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

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

返回顶部