如何查看Django ORM执行的SQL语句的实现


Posted in Python onApril 20, 2020

Django ORM对数据库操作的封装相当完善,日常大部分数据库操作都可以通过ORM实现。但django将查询过程隐藏在了后台,这在开发时可能会略显晦涩,并且使用方式不当还会造成开销过大。

那么如何查看django何时执行了什么sql语句呢?答案是使用Logging。

先直接上方法,在settings.py中加入LOGGING选项,调整logging等级为DEBUG即可:

LOGGING = {
  'version': 1,
  'disable_existing_loggers': False,
  'formatters': {
    'simple': {
      'format': '[%(asctime)s] %(message)s'
    },
  },
  'handlers': {
    'console': {
      'level': 'DEBUG',
      'class': 'logging.StreamHandler',
      'formatter': 'simple'
    },
  },
  'loggers': {
    'django': {
      'handlers': ['console'],
      'level': 'DEBUG',
    },
  },
}

然后启动runserver,浏览需要访问数据库的页面,在shell中即可看见相关日志,如下:

[2018-04-21 21:09:14,676] (0.002) SELECT `blog_article`.`id`, `blog_article`.`title`, `blog_article`.`cover`, `blog_article`.`content`, `blog_article`.`pub_date`, `blog_article`.`category_id`, `blog_article`.`views`, `blog_category`.`id`, `blog_category`.`name` FROM `blog_article` INNER JOIN `blog_category` ON (`blog_article`.`category_id` = `blog_category`.`id`) WHERE `blog_article`.`pub_date` < '2018-04-21 13:09:14.601856' ORDER BY `blog_article`.`pub_date` DESC LIMIT 10; args=('2018-04-21 13:09:14.601856',)
[2018-04-21 21:09:14,678] (0.000) SELECT (`blog_article_topics`.`article_id`) AS `_prefetch_related_val_article_id`, `blog_topic`.`id`, `blog_topic`.`name`, `blog_topic`.`number` FROM `blog_topic` INNER JOIN `blog_article_topics` ON (`blog_topic`.`id` = `blog_article_topics`.`topic_id`) WHERE `blog_article_topics`.`article_id` IN (3, 4, 5, 6, 7, 8, 9, 10, 11, 12) ORDER BY `blog_topic`.`number` ASC; args=(3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
[2018-04-21 21:09:14,708] "GET / HTTP/1.1" 200 22325

上面打印出的日志是我的博客首页获取前十篇文章时所执行的部分SQL语句,其对应的QuerySet为

Article.objects.filter(pub_date__lt=timezone.now())[:10] \
.defer('author', 'category__number') \
.select_related('category') \
.prefetch_related('topics')

通过Logging不仅可以查看SQL语句,还可以由此知道django何时执行了SQL。在某些情况下我们可以通过这种方式判断,后台是否重复执行了SQL语句,便于指导数据库访问优化。

Django使用Python的内建的logging模块执行系统日志记录。

到此这篇关于如何查看Django ORM执行的SQL语句的实现的文章就介绍到这了,更多相关Django ORM执行SQL语句内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
Python 监测文件是否更新的方法
Jun 10 Python
Flask框架学习笔记之模板操作实例详解
Aug 15 Python
Python 用turtle实现用正方形画圆的例子
Nov 21 Python
基于python监控程序是否关闭
Jan 14 Python
pycharm解决关闭flask后依旧可以访问服务的问题
Apr 03 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
python实现暗通道去雾算法的示例
Sep 27 Python
如何用Matlab和Python读取Netcdf文件
Feb 19 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 Python
Django使用channels + websocket打造在线聊天室
May 20 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 #Python
解决Python spyder显示不全df列和行的问题
Apr 20 #Python
Python爬虫实现vip电影下载的示例代码
Apr 20 #Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
Apr 19 #Python
tensorflow中tf.reduce_mean函数的使用
Apr 19 #Python
TensorFlow打印输出tensor的值
Apr 19 #Python
numpy库reshape用法详解
Apr 19 #Python
You might like
ie6 动态缩略图不显示的原因
2009/06/21 PHP
PHP 采集获取指定网址的内容
2010/01/05 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
javascript实现轮显新闻标题链接
2007/08/13 Javascript
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
js opener的使用详解
2014/01/11 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
React-Router如何进行页面权限管理的方法
2017/12/06 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
Python3写入文件常用方法实例分析
2015/05/22 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
Django框架模板用法入门教程
2019/11/04 Python
pytorch nn.Conv2d()中的padding以及输出大小方式
2020/01/10 Python
利用python画出AUC曲线的实例
2020/02/28 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
香港最大的洋酒零售连锁店:屈臣氏酒窖(Watson’s Wine)
2018/12/10 全球购物
Android面试题及答案
2015/09/04 面试题
高中考试作弊检讨书
2014/01/14 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
课改心得体会范文
2016/01/25 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
入党转正申请自我鉴定
2019/06/25 职场文书
QT与javascript交互数据的实现
2021/05/26 Javascript
教你怎么用python selenium实现自动化测试
2021/05/27 Python
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers