您还没有登录。现在登录注册

Django也会智能Lazyload?

分类: 编程   |   jeff  发表于:2007-09-19 00:00:44  |   88条评论  |

今天在本地很快实现了最新评论的功能。在右手边的最新评论点击连接时会去到文章的页面,并定位到评论所在的锚点上,也就是说,我需要在页面上取得评论所在文章的ID,也就是需要这样:{{comment.comment_to.id}}。这时候,我仅仅需要获得文章的ID,但不知道Django是否会到数据库去把相应的文章查出来(我没有使用Select_relate)之后再拿ID呢?不过Django好现没有可以设置打印执行Sql语句的开关,并不能通过配置来看到运行时Django查了多少次数据库。而这样的功能,我使用Java的Hibernate时就有的。

我Google了一下,发现Django本身是没有提供日志和Sql打印功能的。而有人做了些工作,如这位仁兄写了个中间件,可以在页面上打印出该次请求一共执行了多少条语句,每条语句的执行时间。而这里有个叫Django-logging的项目,为Django提供Logging,包括Sql的打印。等会就试验一下。Django天生就是Lazyload的,需要用到数据的时候才去加载,我希望,我的担心是多余的。一会尝试使用Log来看看测试结果吧。

结果一:Select_related对允许为空的外键不起作用。
我的查询语句是这样:entries = blog.entry_set.filter(status=1).select_related(depth=1).order_by('-id') 查询一个Blog下面所有的Entry,并把有关联的数据一并抓取出来(根据ForeignKey)。也就是说,在查询Entry的同时查出Blog,作者,分类等信息。
但是情况是,我在页面找印这些文章的时候,需要把文章的分类也打显示出来,这时候,Django却跑到数据库执行了N次查询分类的语句。暴汗。这是经典的Hibernate的延迟加载用得不恰当的情况啊!我一看打印出来的查询语句,有查相关的作者、Blog,但偏偏没有查分类。最后我回到Model里比较了一下,我的分类属性上面设置了null=true,原意是让文章可以没有分类。最后我尝试着去掉Null=true,一运行。那N条查询不见了。靠。。原来Select_related在外键允许空的情况下是行不通D。

结果二:Django不会智能LazyLoad。要手动去Select_related。
回到对Django有疑问的情景,recent_comments = Comment.objects.filter(blog=blog).order_by('-comment_time')[:10] 查出本BLog最新的十条评论。我的假设是,Comment本身保存有Entry的ID,所以在仅仅是获取Entry的ID的时候不需要去数据据里找,Hibernate的LazyLoad就是这样做的,使用动态代理的解决方案。我想在Python这样的动态语言的解决方案更佳,但事实证明我错了。上面的语句又产生了经典的1+N的问题。我在页面根据评论取EntryID的时候{{comment.entry.id}}还是去加载了一次数据,搞笑的是,这句查询需要得到的数据对我有用的是ID,但是查询条件就是ID。我只好把查询语句改成:
recent_comments = Comment.objects.select_related(depth=1).filter(blog=blog).order_by('-comment_time')[:10]。显示去Select_related。宁愿直接去Join相关的表,也不要做1+ N的查询。显然这很浪费,仅仅为了一个ID,要Join好几个表。

站内搜索

作者简介

jeff

OK Computer!

mail
qq

订阅我

我看我听我读

都有谁评论鸟

Tags

python 音乐 朋友 工作 django java 旅游 生活 丽江 云南 编程 google 2008 中国 年假 摇滚 javascript ajax grails 部署 apache air 学习 卖唱 lucene 技术 体验 发呆 flex 灾害 乐队 plone 灾难 哀悼日 开源 jmesa jquery flash ext web 健康 全文搜索 电影 sql 感情 orm 诗歌 数据库 计划 开发 原创 更新 空间 休假 life 许巍 杭州 鼻炎 moin 真诚 人生 感悟 感性 信息 设计 需求 ria 遇窃 香格里拉 大理 管理 算法 cms nuexo zope 左小诅咒 汉诺塔 AMF prototpye 快速开发 actionscript beautifulSoup 递归 网络 opensource 结婚 捐赠 scrum 软件过程 demo wiki 西片 英伦 中间件 erlang 并发 函数式编程 中文分词 模板 分页 成功 pagerank hibernate 日志 MYMeditor 恐怖 惊变 mysql rss 文艺片 太阳 彩色 factcgi lighttpd editor 中文 个性化 秋天 暴力 美学 声音玩具 独立 备份 数据 琐事 博客 接口 设计模式 地下 广州 dvd 互联网 json 事业 职业 读书 香港 澳门 忧郁 冬天 compass 图表

日志分类

友情连接

Power By