[Django] 查看orm自动执行的原始查询sql

django的文档看了很多,也用了不少,有的时候感觉性能很不好,知道很多地方是惰性查询,但是对于复杂的逻辑,只是表面上发现运行很慢,机器资源消耗很多,却不知道orm到底是什么来转化成sql和查询的。


之前django1.3版本在google上找到了写方法,通过配置settings就能看到每次查询的原始sql,现在用1.6的版本也懒得去找了,反正在自己机子上看法,只是些简单的监视直接改下源码就好了。 


于是翻了下django的源码,主要的sql执行语句在

D:\devsofts\python2.7\Lib\site-packages\django\db\models\sql\compiler.py 文件中

这里的D:\devsofts\python2.7是python的安装目录,每个人安装的可能不一样,自己找一下就行了,后面的目录基本是相同的。


在这个文件中查找execute_sql 方法,在758行左右。

在方法中执行sql之前加入一个print,就能在控制台看到sql执行的情况了。这里用的msyql数据库

        print "connexesql ->%s"%sql
        cursor = self.connection.cursor()
        cursor.execute(sql, params)

效果:

connexesql ->SELECT `mngm_area`.`id` FROM `mngm_area` WHERE `mngm_area`.`parentid` = %s 
connexesql ->SELECT `mngm_device`.`mac` FROM `mngm_device` WHERE `mngm_device`.`area_id` IN (%s, %s, %s, %s, %s) ORDER BY `mngm_device`.`hostname` ASC
connexesql ->SELECT `ad_material`.`id`, `ad_material`.`user_id`, `ad_material`.`name`, `ad_material`.`category`, `ad_material`.`anchor`, `ad_material`.`target`, `ad_material`.`note`, `ad_material`.`status`, `ad_material`.`addtime`, `ad_material`.`lastmodified` FROM `ad_material` WHERE `ad_material`.`id` = %s 
{connexesql ->SELECT `mngm_area`.`id` FROM `mngm_area` WHERE `mngm_area`.`parentid` = %s 
connexesql ->SELECT `mngm_device`.`mac` FROM `mngm_device` WHERE `mngm_device`.`area_id` IN (%s, %s, %s, %s, %s) ORDER BY `mngm_device`.`hostname` ASC
connexesql ->SELECT `ad_material`.`id`, `ad_material`.`user_id`, `ad_material`.`name`, `ad_material`.`category`, `ad_material`.`anchor`, `ad_material`.`target`, `ad_material`.`note`, `ad_material`.`status`, `ad_material`.`addtime`, `ad_material`.`lastmodified` FROM `ad_material` WHERE `ad_material`.`id` = %s 
{

这样就比较容易发现程序不好的写法,及时纠正了。 


后续:

这样修改之后打印的日志只有查询语句,插入更新删除语句的debug,在读源码之后分享出来。


本文出自 orangleliu笔记本 博客,请务必保留此出处http://blog.csdn.net/orangleliu/article/details/40115471




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值