DjangoORM对数据库操作有完善的封装,日常的大部分数据库操作都可以通过ORM实现。但django将查询过程隐藏在后台,开发时可能会有些晦涩难懂,使用不当会造成过大的开销。那么如何查看django什么时候执行了哪些sql语句呢?答案是使用日志记录。首先直接进入方法,在settings.py中添加LOGGING选项,将日志级别调整为DEBUG:LOGGING={'version':1,'disable_existing_loggers':False,'formatters':{'simple':{'格式':'[%(asctime)s]%(message)s'},},'handlers':{'console':{'level':'DEBUG','class':'logging.StreamHandler','formatter':'simple'},},'loggers':{'django':{'handlers':['console'],'level':'DEBUG',},},}然后启动runserver并浏览需要访问的数据库页面,可以在shell中看到相关日志,如下:[2018-04-2121: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`INNERJOIN`blog_category`ON(`blog_article`.`category_id`=`blog_category`.`id`)WHERE`blog_article`.`pub_date`<'2018-04-211个3:09:14.601856'按`blog_article`.`pub_date`DESCLIMIT10排序;args=('2018-04-2113:09:14.601856',)[2018-04-2121: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`INNERJOIN`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)ORDERBY`blog_topic`.`number`ASC;args=(3,4,5,6,7,8,9,10,11,12)[2018-04-2121:09:14,708]"GET/HTTP/1.1"20022325上面打印的日志是部分我的博客首页获取前十篇文章时执行的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内置的日志记录模块来执行系统日志记录。原文链接
