0
点赞
收藏
分享

微信扫一扫

【Django文档转译】第2章:模型层——第3节:迁移(模块3: SchemaEditor)


SchemaEditor¶

班级BaseDatabaseSchemaEditor[源代码]¶
Django的迁移系统分为两部分:计算和存储应该运行哪些操作的逻辑(django.db.migrations),以及将“创建模型”或“删除字段”等内容转换为SQL的数据库抽象层–这是SchemaEditor.

您不太可能希望直接与SchemaEditor作为使用Django的普通开发人员,如果您想编写自己的迁移系统,或者有更高级的需求,这比编写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(模型)[源代码]¶
在数据库中为所提供的模型创建一个新表,以及所需的任何唯一约束或索引。

delete_model()¶
BaseDatabaseSchemaEditor.delete_model(模型)[源代码]¶
在数据库中删除模型的表以及它所具有的任何唯一约束或索引。

add_index()¶
BaseDatabaseSchemaEditor.add_index(模型, 指数)[源代码]¶
加指数到模型桌子。

remove_index()¶
BaseDatabaseSchemaEditor.remove_index(模型, 指数)[源代码]¶
移除指数从…模型桌子。

alter_unique_together()¶
BaseDatabaseSchemaEditor.alter_unique_together(模型, 旧独在一起, 新的独特组合)[源代码]¶
更改模型的unique_together值;这将从模型的表中添加或删除唯一的约束,直到它们与新值匹配为止。

alter_index_together()¶
BaseDatabaseSchemaEditor.alter_index_together(模型, 旧指数, 新索引)[源代码]¶
更改模型的index_together值;这将从模型的表中添加或删除索引,直到它们与新值匹配为止。

alter_db_table()¶
BaseDatabaseSchemaEditor.alter_db_table(模型, 旧db表, 新db表)[源代码]¶
将模型的表重命名为旧db表到新db表.

alter_db_tablespace()¶
BaseDatabaseSchemaEditor.alter_db_tablespace(模型, 旧db表空间, 新db表空间)[源代码]¶
将模型的表从一个表空间移动到另一个表空间。

add_field()¶
BaseDatabaseSchemaEditor.add_field(模型, 场域)[源代码]¶
将列(有时是多列)添加到模型的表中,以表示字段。如果字段具有db_index=True或unique=True.

如果字段是ManyToManyField没有价值的through,它将创建一个表来表示关系,而不是创建一个列。如果through是不允许的。

如果字段是ForeignKey,这还会将外键约束添加到列中。

remove_field()¶
BaseDatabaseSchemaEditor.remove_field(模型, 场域)[源代码]¶
从模型的表中移除表示字段的列,以及任何由该字段引起的唯一约束、外键约束或索引。

如果该字段为ManyToManyField,则为through,它将删除为跟踪关系而创建的表。如果through是不允许的。

alter_field()¶
BaseDatabaseSchemaEditor.alter_field(模型, 旧场, 新场, 严格=假)[源代码]¶
这会将模型上的字段从旧字段转换为新字段。这包括更改列的名称(db_column属性),更改字段的类型(如果字段类更改),则更改NULL字段的状态、添加或移除字段唯一的约束和索引、更改主键和更改ForeignKey制约因素。

最常见的转换是将ManyToManyField进入正常字段或反之亦然;Django不能在不丢失数据的情况下做到这一点,因此它将拒绝这样做。相反,remove_field()和add_field()应该单独调用。

如果数据库具有supports_combined_alters,Django将尝试在单个数据库调用中尽可能多地执行这些操作;否则,它将为每个更改发出单独的ALTER语句,但不会在不需要更改的地方发出更改(南方经常这样做)。

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

connection¶
SchemaEditor.connection¶
到数据库的连接对象。连接的一个有用属性是alias可用于确定要访问的数据库的名称。

在执行数据迁移时,这是非常有用的。多数据库迁移.


举报

相关推荐

0 条评论