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
文件中,如果用户希望这样做。
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()
¶
-
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=True
或 unique=True
,这也将添加索引或唯一约束。
如果该字段是 ManyToManyField
且没有 through
的值,则它不会创建列,而是创建一个表来表示关系。如果提供了 through
,则它是一个无操作。
如果该字段是 ForeignKey
,这也会将外键约束添加到该列。
remove_field()
¶
-
BaseDatabaseSchemaEditor.
remove_field
(model, field)¶
从模型的表中删除表示该字段的列,以及该字段引起的任何唯一约束、外键约束或索引。
如果该字段是 ManyToManyField
且 through
没有值,它将删除创建的用于跟踪关系的表。如果提供了 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
,它可用于确定正在访问的数据库的名称。
这在对 具有多个数据库的迁移 进行数据迁移时很有用。