如何查看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 相关文章推荐
Python中的面向对象编程详解(上)
Apr 13 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
教你用一行Python代码实现并行任务(附代码)
Feb 02 Python
Python实现上下班抢个顺风单脚本
Feb 07 Python
tensorflow实现softma识别MNIST
Mar 12 Python
python中cPickle类使用方法详解
Aug 27 Python
关于阿里云oss获取sts凭证 app直传 python的实例
Aug 20 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
python实现简单银行管理系统
Oct 25 Python
Python使用re模块验证危险字符
May 21 Python
python 提取html文本的方法
May 20 Python
全网非常详细的pytest配置文件
Jul 15 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
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
php过滤敏感词的示例
2014/03/31 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
PHP使用递归生成文章树
2015/04/21 PHP
PHP生成器简单实例
2015/05/13 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
layui表格数据复选框回显设置方法
2019/09/13 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
python 调用HBase的简单实例
2016/12/18 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
python 字典的打印实现
2019/09/26 Python
python框架flask表单实现详解
2019/11/04 Python
python操作cfg配置文件方式
2019/12/22 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
python如何查看网页代码
2020/06/07 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
学习标兵获奖感言
2014/02/20 职场文书
2014年领班工作总结
2014/11/25 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android