Django为何用Python代码定义数据模型

MTV里的M代表模型。 Django模型是用Python代码形式表述的数据在数据库中的定义。对数据层来说它等同于 CREATE TABLE 语句,只不过执行的是Python代码而不是 SQL,而且还包含了比数据库字段定义更多的含义。Django用模型在后台执行SQL代码并把结果用Python的数据结构来描述。 Django也使用模型来呈现SQL无法处理的高级概念。

1 from django.db import models
2
3 class Publisher(models.Model):
4 name = models.CharField(max_length=30)
5 address = models.CharField(max_length=50)
6 city = models.CharField(max_length=30)
7 website = models.URLField()

 

如果你对数据库很熟悉,你可能马上就会想到,用Python来定义数据模型是不是有点多余? Django这样做是有下面几个原因的:


1. 自省(运行时自动识别数据库)会导致过载和有数据完整性问题。为了提供方便的数据访问API, Django需要以某种方式知道数据库层内部信息,有两种实现方式。第一种方式是用Python明确地定义数据模型,第二种方式是通过自省来自动侦测识别数据模型。

第二种方式看起来更清晰,因为数据表信息只存放在一个地方-数据库里,但是会带来一些问题。首先,运行时扫描数据库会带来严重的系统过载。如果每个请求都要扫描数据库的表结构,或者即便是服务启动时做一次都是会带来不能接受的系统过载。(有人认为这个程度的系统过载是可以接受的,而Django开发者的目标是尽可能地降低框架的系统过载)。第二,某些数据库,尤其是老版本的MySQL,并未完整存储那些精确的自省元数据。

2. 编写Python代码是非常有趣的,保持用Python的方式思考会避免你的大脑在不同领域来回切换。尽可能的保持在单一的编程环境/思想状态下可以帮助你提高生产率。不得不去重复写SQL,再写Python代码,再写SQL,…,会让你头都要裂了。

3. 把数据模型用代码的方式表述来让你可以容易对它们进行版本控制。这样,你可以很容易了解数据层的变动情况。

4. SQL只能描述特定类型的数据字段。例如,大多数数据库都没有专用的字段类型来描述Email地址、URL。而用Django的模型可以做到这一点。好处就是高级的数据类型带来更高的效率和更好的代码复用。

5. SQL还有在不同数据库平台的兼容性问题。发布Web应用的时候,使用Python模块描述数据库结构信息可以避免为MySQL, PostgreSQL, and SQLite编写不同的CREATE TABLE。

 


当然,这个方法也有一个缺点,就是Python代码和数据库表的同步问题。 如果你修改了一个Django模型, 你要自己来修改数据库来保证和模型同步。

$python manage.py syncdb //不能将模型的修改或删除同步到数据库
$python manage.py dbshell //依据DATABASE_SERVER的里设置自动检测使用哪种命令行客户端

当修改或删除数据模型时,执行上述命令什么也不会发生(只有添加新模型或新app时才起作用)。因此,执行上述命令是安全的,因为它不会重复执行定义的SQL.

解决这个问题一般用以下策略:

  1. 修改models.py里的模型定义,用python manage.py sqlall查看新的sql语句。
  2. 在dbshell或db客户端使用alter table做字段的增删改等操作。

 

最后,提醒你Django提供了实用工具来从现有的数据库表中自动扫描生成模型。 这对已有的数据库来说是非常快捷有用的。 

posted @ 2012-04-03 22:57  残夜  阅读(1534)  评论(0编辑  收藏  举报