SchemaEditor
¶
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()
¶
执行传入的 SQL 语句,如果提供则带参数。这是对普通数据库游标的包装,它允许将 SQL 捕获到 .sql
文件中(如果用户希望)。
create_model()
¶
为提供的模型在数据库中创建一个新表,以及它需要的任何唯一约束或索引。
delete_model()
¶
删除数据库中模型的表以及它具有的任何唯一约束或索引。
add_index()
¶
将 index
添加到 model
的表中。
remove_index()
¶
从 model
的表中删除 index
。
rename_index()
¶
将 model
表中的 old_index
重命名为 new_index
。
add_constraint()
¶
将 constraint
添加到 model
的表中。
remove_constraint()
¶
从 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()
¶
将模型的表从 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()
¶
将模型的表从一个表空间移动到另一个表空间。
add_field()
¶
向模型的表中添加一个(有时是多个)列来表示该字段。如果字段具有 db_index=True
或 unique=True
,则还会添加索引或唯一约束。
如果字段是 ManyToManyField
且没有 through
的值,则不会创建列,而是创建一个表来表示关系。如果提供了 through
,则这是一个空操作。
如果字段是 ForeignKey
,这也会向列添加外键约束。
remove_field()
¶
从模型的表中删除表示该字段的列,以及该字段引起的任何唯一约束、外键约束或索引。
如果字段是 ManyToManyField
且没有 through
的值,则它将删除创建用于跟踪关系的表。如果提供了 through
,则这是一个空操作。
alter_field()
¶
这将模型上的字段从旧字段转换为新字段。这包括更改列的名称(db_column
属性)、更改字段的类型(如果字段类更改)、更改字段的 NULL
状态、添加或删除仅字段的唯一约束和索引、更改主键以及更改 ForeignKey
约束的目标。
此操作最常见的无法执行的转换是将 ManyToManyField
转换为普通字段或反之亦然;Django 无法在不丢失数据的情况下执行此操作,因此它将拒绝执行。相反,应分别调用 remove_field()
和 add_field()
。
如果数据库具有 supports_combined_alters
,Django 将尝试在单个数据库调用中尽可能多地执行这些操作;否则,它将为每个更改发出单独的 ALTER 语句,但不会在不需要更改的情况下发出 ALTER。
属性¶
除非另有说明,否则所有属性应视为只读。
connection
¶
- SchemaEditor.connection¶
数据库的连接对象。连接的一个有用属性是 alias
,它可用于确定正在访问的数据库的名称。
这在对 具有多个数据库的迁移 执行数据迁移时很有用。