SchemaEditor — Django 文档
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_ddl
和 supports_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=True
或 unique=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
,可用于确定正在访问的数据库的名称。
这在为具有多个数据库 的 迁移进行数据迁移时非常有用。