设为首页 收藏本站
查看: 859|回复: 0

[经验分享] Django为何用Python代码定义数据模型

[复制链接]

尚未签到

发表于 2015-4-26 10:28:25 | 显示全部楼层 |阅读模式
  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.
  解决这个问题一般用以下策略:


  • 修改models.py里的模型定义,用python manage.py sqlall查看新的sql语句。
  • 在dbshell或db客户端使用alter table做字段的增删改等操作。
  
  最后,提醒你Django提供了实用工具来从现有的数据库表中自动扫描生成模型。 这对已有的数据库来说是非常快捷有用的。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60807-1-1.html 上篇帖子: python利用elaphe制作二维条形码 下篇帖子: python的正则表达式 re---好困啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表