django 1.8 官方文档翻译: 2-4-3 模式编辑器

简介: 模式编辑器class BaseDatabaseSchemaEditor[source]Django的迁移系统分为两个部分;计算和储存应该执行什么操作的逻辑 (django.db.migrations) ,以及用于把“创建模型”或者“删除字段”变成SQL语句的数据库抽象层 – 后者是模式编辑器的功能。

模式编辑器

class BaseDatabaseSchemaEditor[source]

Django的迁移系统分为两个部分;计算和储存应该执行什么操作的逻辑 (django.db.migrations) ,以及用于把“创建模型”或者“删除字段”变成SQL语句的数据库抽象层 – 后者是模式编辑器的功能。

你可能并不想像一个普通的开发者使用Django那样,直接和模型编辑器进行交互,但是如果你编写自己的迁移系统,或者有更进一步的需求,这样会比编写SQL语句更方便。

每个Django的数据库后端都提供了它们自己的模式编辑器,并且总是可以通过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_ddlsupports_combined_alters都很重要。

方法

execute

BaseDatabaseSchemaEditor.execute(sql, params=[])[source]

执行传入的 SQL语句,如果提供了参数则会带上它们。这是对普通数据库游标的一个简单封装,如果用户希望的话,它可以从.sql文件中获取SQL。

create_model

BaseDatabaseSchemaEditor.create_model(model)[source]

为提供的模型在数据库中创建新的表,带有所需的任何唯一性约束或者索引。

delete_model

BaseDatabaseSchemaEditor.delete_model(model)[source]

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

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_tablespace

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

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

add_field

BaseDatabaseSchemaEditor.add_field(model, field)[source]

向模型的表中添加一列(或者有时几列),表示新增的字段。如果该字段带有db_index=True或者 unique=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(就像South经常做的那样)。

属性

除非另有规定,所有属性都应该是只读的。

connection

SchemaEditor.connection

一个到数据库的连接对象。aliasconnection的一个实用的属性,它用于决定要访问的数据库的名字。

当你在多种数据库之间执行迁移的时候,这是非常有用的。

译者:Django 文档协作翻译小组,原文:SchemaEditor

本文以 CC BY-NC-SA 3.0 协议发布,转载请保留作者署名和文章出处。

Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。

相关文章
|
11月前
|
小程序 Linux
VI编辑器(一)vi工作模式(3种)以及模式切换(转换)
开始VI编辑器的学习。 之前在linux服务器上边看代码的时候一般都是使用远程ftp工具(类似winscp)将文件下载到本地,在使用编辑器查看,但是这样相对比较麻烦。 Linux为我们提供了一个很棒的编辑器VI 下面我们来看下VI的三种工作模式以及模式之间的切换。 首先我们来看下VI编辑器的调用 Vi filename(文件名) 文件已存在,直接打开,文件不存在,新建后打开。 一:VI的三种工作模式 1:命令行模式 该模式是进入 vi 编辑器后的默认模式。任何时候,不管用户处于何种模式,按下Esc键即可进入命令模式。 在命令模式下,用户可以输入 vi 命令,用于管理自己的文档。此时从键盘上输
1030 0
Summernote 富文本编辑器的内容变成只读模式
这篇文章介绍了如何使用Summernote富文本编辑器的disable方法将编辑器设置为只读模式。
|
3月前
|
存储 安全 数据安全/隐私保护
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
132 0
|
4月前
|
开发工具
vi编辑器,现在vi\vim是文本文件进行编辑的最佳选择,Vim是vi的加强的版本,兼容vi的所有指令,vim编辑器有三种工作模式,一开始进入的是命令模式,命令模式i是插入的意思,两下y+p复制内容
vi编辑器,现在vi\vim是文本文件进行编辑的最佳选择,Vim是vi的加强的版本,兼容vi的所有指令,vim编辑器有三种工作模式,一开始进入的是命令模式,命令模式i是插入的意思,两下y+p复制内容
|
3月前
|
存储 JSON 机器人
【Azure 机器人】微软Azure Bot 编辑器系列(2) : 机器人/用户提问回答模式,机器人从API获取响应并组织答案 (The Bot Framework Composer tutorials)
【Azure 机器人】微软Azure Bot 编辑器系列(2) : 机器人/用户提问回答模式,机器人从API获取响应并组织答案 (The Bot Framework Composer tutorials)
|
3月前
|
存储
UE建模模式编辑器工具的快速入门教程
在UE虚幻引擎中,想要进行创建网格体、制作新关卡几何原型、编辑现有静态网格体资产等模型编辑动作,都需要借助建模模式的编辑器完成。因此,充分掌握编辑器能力是每个UE开发人员必备的基础技能,尽管UE建模模式中的许多工具与其他建模软件工具操作类似,但在如何构建网格体编辑方面存在着重要区别。 下面就带大家一起了解「UE建模模式编辑器」的不同之处🤔。
先文章写在自己的富文本上,痛点,商业模式,支持文章转载,搭建工具------自媒体平台之间快速上传文章的方法,利用自己的富文本编辑器进行上传
先文章写在自己的富文本上,痛点,商业模式,支持文章转载,搭建工具------自媒体平台之间快速上传文章的方法,利用自己的富文本编辑器进行上传
|
6月前
|
存储 搜索推荐 Java
java基于B/S模式的医院电子病历编辑器源码
电子病历内涵应包括: 1.信息共享。医院各个部门、科室在任何时间和地点都能调阅到病人所在医院的全部病历记录; 2.具有预警功能,对药物配伍禁忌、医疗方法不当进行提示; 3.支持医疗信息资料库,供医疗人员在工作时查询使用。
111 1
|
6月前
|
存储 前端开发 JavaScript
前后端分离模式开发的BS电子病历编辑器源码(Java)
前后端分离模式开发的BS电子病历编辑器源码(Java)
120 0
|
11月前
|
数据可视化 Linux 开发工具
【Linux】开发工具——vim多模式编辑器的入土&&设置sudoers白名单
通过前面几篇文章的学习我们已经对Linux操作系统算是比较了解了,可以熟练的使用一些指令,我们就要进入Linux下的系统编程。在Windows系统下可以安装各种集成开发环境像Dev-C++、VC6.0、VS等等,在这些软件中我们不仅可以写代码,软件也可以完成编译、链接,甚至是调试等一系列功能。而在我们Linux系统中编写代码、编译代码、调试代码可以说都是分开的,使用各种工具完成。例如:编写代码使用vim多功能编辑器、编译代码使用gcc/g++编译器、调试代码使用gdp调试器。今天给大家带来的是vim多功能编辑器的使用。