首页 > 代码库 > [Django] 查看orm自动执行的原始sql

[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 
{

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

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




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