从Django QuerySet获取SQL

exu*_*ero 279 python sql django django-queryset

如何从QuerySet对象获取Django将在数据库中使用的SQL?我正在尝试调试一些奇怪的行为,但我不确定哪些查询会进入数据库.谢谢你的帮助.

jpw*_*tts 422

您打印查询集的query属性.

>>> queryset = MyModel.objects.all()
>>> print(queryset.query)
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`query`的输出不是有效的SQL,因为"Django实际上从不插入参数:它将查询和参数分别发送到数据库适配器,后者执行适当的操作." 资料来源:https://code.djangoproject.com/ticket/17741 (21认同)
  • 要从 Postgres 获取有效的 SQL,请使用:/sf/ask/567878811/ (4认同)
  • 是否可以在实际执行之前查看 SQL 查询?我收到数据库错误并想查看它正在尝试执行什么 SQL,但是当我运行此命令时,我只是收到数据库错误并且无法查看完整的 SQL。 (2认同)

Mik*_*iak 50

简单:

print my_queryset.query
Run Code Online (Sandbox Code Playgroud)

例如:

from django.contrib.auth.models import User
print User.objects.filter(last_name__icontains = 'ax').query
Run Code Online (Sandbox Code Playgroud)

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

from django.db import connections
connections['default'].queries
Run Code Online (Sandbox Code Playgroud)

Django的调试工具栏项目使用此提出查询页面上在一个整洁的方式.

  • 这并不总是输出有效的 SQL,请参阅其他答案 (3认同)
  • 没有先执行查询就无法获得实际的 SQL,最终的 SQL 是由周围的 RDBMS 驱动程序生成的,而不是 Django。答案是正确的,因为它是您使用 Django QuerySet 所能得到的最多结果。 (2认同)

Hak*_* B. 41

使用Django 1.4.4时,接受的答案对我不起作用.而不是原始查询,返回了对Query对象的引用:<django.db.models.sql.query.Query object at 0x10a4acd90>.

以下返回了查询:

>>> queryset = MyModel.objects.all()
>>> queryset.query.__str__()
Run Code Online (Sandbox Code Playgroud)

  • 它可能不起作用,因为你只输入`queryset.query`而不是`print queryset.query`,它调用`__str __()` (27认同)
  • str(queryset.query)会更加pythonic. (16认同)
  • @hughes是对的.如果你不想打印它并希望它作为一个字符串,而不是调用`__str __()`来把它作为一个字符串,你应该做`str(queryset.query)`. (10认同)

Gui*_*vin 10

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

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


Tom*_*ski 10

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