【问题标题】:Getting the SQL from a Django QuerySet [duplicate]从 Django QuerySet 获取 SQL [重复]
【发布时间】:2011-04-14 11:31:52
【问题描述】:

如何从 QuerySet 对象获取 Django 将在数据库上使用的 SQL?我正在尝试调试一些奇怪的行为,但我不确定哪些查询会发送到数据库。

【问题讨论】:

  • 这不是重复的。链接的问题是一个完全不同的主题。
  • @Wooble 这不是重复的。它与其他问题位于同一区域,但此问题与特定查询有关,而不是所有查询。

标签: python sql django django-queryset


【解决方案1】:

您打印查询集的query 属性。

>>> queryset = MyModel.objects.all()
>>> print(queryset.query)
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel"

【讨论】:

  • 我发现 this 含蓄地提到它,但没有明确记录上述内容
  • 请注意,query 的输出不是有效的 SQL,因为“Django 从不实际插入参数:它将查询和参数分别发送到执行适当操作的数据库适配器。”来源:code.djangoproject.com/ticket/17741
  • 我必须在哪里编写查询... MyModel 是位于 models.py 文件中的一个类...我的疑问是我必须在哪里编写 sql 查询以从表中检索值。跨度>
  • 是否可以在 SQL 查询实际执行之前看到它?我收到一个数据库错误,想看看它试图执行什么 SQL,但是当我运行它时,我只是得到一个数据库错误并且看不到完整的 SQL。
  • 如果你做的不是print,你可能不得不使用str(queryset.query),因为type(queryset.query) == Query
【解决方案2】:

The accepted answer 在使用 Django 1.4.4 时对我不起作用。返回的不是原始查询,而是对 Query 对象的引用:<django.db.models.sql.query.Query object at 0x10a4acd90>

以下返回查询:

>>> queryset = MyModel.objects.all()
>>> queryset.query.__str__()

【讨论】:

  • 它可能不起作用,因为您只是输入了queryset.query 而不是print queryset.query,它调用了__str__()
  • @hughes 是对的。如果您不想打印它并希望将其作为字符串,而不是调用__str__() 将其作为字符串获取,您应该使用str(queryset.query)
  • 我正在使用 ipdb 进行调试,当我执行 p queryset 时,它会打印对查询对象的引用。 p queryset.__str__() 产生所需的结果,因此这是一个更好的答案。
  • str(queryset.query) 会更 Pythonic。
  • 我在manage.py shell 遇到了这个问题(__str__() 完成了这项工作)
【解决方案3】:

简单:

print my_queryset.query

例如:

from django.contrib.auth.models import User
print User.objects.filter(last_name__icontains = 'ax').query

还应该提到的是,如果您有 DEBUG = True,那么您的所有查询都会被记录下来,您可以通过访问 connection.queries 来获取它们:

from django.db import connections
connections['default'].queries

django debug toolbar 项目使用它在页面上以简洁的方式呈现查询。

【讨论】:

  • 这并不总是输出有效的 SQL,请参阅其他答案
  • 如果不先执行查询,就无法获得实际的 SQL,最终的 SQL 是由周围的 RDBMS 驱动程序生成的,而不是 Django。答案是正确的,因为它是 Django QuerySet 所能得到的最大结果。
【解决方案4】:

这个中间件会将每个 SQL 查询输出到您的控制台,带有颜色突出显示和执行时间,它对我优化一些棘手的请求非常宝贵

http://djangosnippets.org/snippets/290/

【讨论】:

    【解决方案5】:

    作为其他答案的替代方案,django-devserver 将 SQL 输出到控制台。

    【讨论】:

      猜你喜欢
      • 2021-05-06
      • 2020-11-29
      • 2017-08-25
      • 1970-01-01
      • 2011-04-15
      • 2017-06-22
      • 2022-11-30
      • 2017-08-11
      相关资源
      最近更新 更多