【问题标题】:django, one orm command execute duplicate sql sentencedjango,一个orm命令执行重复的sql语句
【发布时间】:2015-05-26 08:05:38
【问题描述】:

测试代码:

1、  b = 1
2、  aa = Forum.objects.values('id')
3、  d = 2
4、  print aa[0]['id']

然后我用linux命令监控mysql执行:

tail -f /var/log/mysql/mysql.log

然后我逐行调试代码, 在第 2 行,监视器屏幕打印

25 Query    SELECT `forum`.`id` FROM `forum` ORDER BY `forum`.`display_order` ASC LIMIT 21
25 Query    SELECT `forum`.`id` FROM `forum` ORDER BY `forum`.`display_order` ASC LIMIT 21

在第 3 行,监视器屏幕打印

25 Query    SELECT `forum`.`id` FROM `forum` ORDER BY `forum`.`display_order` ASC LIMIT 21
25 Query    SELECT `forum`.`id` FROM `forum` ORDER BY `forum`.`display_order` ASC LIMIT 21

在第 4 行,监视器屏幕打印

25 Query    SELECT `forum`.`id` FROM `forum` ORDER BY `forum`.`display_order` ASC LIMIT 21
25 Query    SELECT `forum`.`id` FROM `forum` ORDER BY `forum`.`display_order` ASC LIMIT 21

为什么一个orm语句在mysql日志中执行了这么多次

【问题讨论】:

  • 理论上没有理由认为第 3 行和第 4 行会触发查询。您确定您对日志文件的解释正确吗?我建议您安装 django-toolbar 并在那里检查您的查询。
  • @Wtower 是的,使用 diango-toolbar 它只执行一次。可能是mysql日志中存在一些错误
  • 我怀疑您的日志有误,我会说您的 shell 出于某种原因正在重新运行查询。

标签: mysql django orm


【解决方案1】:

查询集是惰性的。查询通过以下方式评估:

  • 迭代
  • 切片
  • 酸洗/缓存
  • repr()
  • len()
  • list()
  • bool()

来源:Django documentation: Queryset API reference

因此,语句 3 和 4 不以任何方式处理查询集,因此至少在理论上不可能触发任何查询,这表明您的日志有问题。

django-toolbar 是一款不错的应用程序,除其他外,它可以向您显示执行的查询并可以帮助您。

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    相关资源
    最近更新 更多