[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

时间: 2024-12-31 19:06:37

[Django] 查看orm自动执行的原始sql的相关文章

查看MySQL记录执行过的SQL

第一种:查Slow query的SQL语法: log_slow_queries = /var/log/mysql/mysql-slow.log long_query_time = 2 (超过2秒的SQL语法记录起来,设短一点来记录除错也是一种方法.) 第二种:设MySQL Replication用binlog: log_bin = /var/log/mysql/mysql-bin.log (此档要用mysqlbinlog解来看, mysqlbinlog mysql-bin.000042| gre

[Django] 查看orm自己主动运行的原始查询sql

django的文档看了非常多.也用了不少,有的时候感觉性能非常不好,知道非常多地方是惰性查询.可是对于复杂的逻辑.仅仅是表面上发现执行非常慢,机器资源消耗非常多.却不知道orm究竟是什么来转化成sql和查询的. 之前django1.3版本号在google上找到了写方法,通过配置settings就能看到每次查询的原始sql,如今用1.6的版本号也懒得去找了,反正在自己机子上看法.仅仅是些简单的监视直接改下源代码就好了. 于是翻了下django的源代码.基本的sql运行语句在 D:\devsofts

在django中,执行原始sql语句

extra()方法 结果集修改器,一种提供额外查询参数的机制 使用extra: 1:Book.objects.filter(publisher__name='广东人员出版社').extra(where=['price>50']) Book.objects.filter(publisher__name='广东人员出版社',price__gt=50) 2:Book.objects.extra(select={'count':'select count(*) from hello_Book'}) ra

一个冷备份的自动执行脚本

花了一天多时间,捣鼓出一个SQL 脚本,用于执行ORACLE自动冷备份.记录如下: set echo off                               --关闭命令回显,但会显示执行后的命令. set serveroutput on                        --返回结果,如果关闭,将无法把结果传到下一个文件. set escape on                              --打开转义符功能,否则遇到/无法进行. set headin

django 执行原始SQL

二.知识点总结 When the model query APIs don’t go far enough, you can fall back to writing raw SQL. go far enough:远远不够fall back to:求助 raw:原始的,未加工的 Django提供两种方式执行(performing)原始的SQL查询: (1) . Manager.raw():执行原始查询并返回模型实例 (2) . Executing custom SQL directly :直接执

11.Django数据库操作(执行原生SQL)

1.使用extra方法 解释:结果集修改器,一种提供额外查询参数的机制 说明:依赖model模型 用在where后: Book.objects.filter(publisher_id="1").extra(where=["title='python学习1'"]) 用在select后 Book.objects.filter(publisher_id="1").extra(select={"count":"select

如何查看PostgreSQL正在执行的SQL

SELECT      procpid,      start,      now() - start AS lap,      current_query  FROM      (SELECT          backendid,          pg_stat_get_backend_pid(S.backendid) AS procpid,          pg_stat_get_backend_activity_start(S.backendid) AS start,        

查看oracle 用户执行的sql语句历史记录

select * from v$sqlarea t order by t.LAST_ACTIVE_TIME desc 注意 :执行此语句等等一些相关的语句 必须具有DBA 的权限 虽然这条语句很普通 但是需要的时候很管用 能够及时查出一个人执行sql语句情况 -------oracle 查看已经执行过的sql 这些是存在共享池中的 --------->select * from v$sqlarea t order by t.LAST_ACTIVE_TIME desc -----------查看o

oracle自动执行一个sql文件的脚本

如图 文件夹 打开文件夹,如图 autoExeSyn-local.bat文件里的内容如下 @echo off -- 用户/密码 实例 执行的sql文件 > 生成日志文件 -- sqlplus cqy_2v/gmgl@GLXT @F:\自动运行脚本\delete.sql > log.txt --退出-- exit delete.sql文件的内容 drop user syncto cascade;