【问题标题】:Django, is there a way to see what SQL queries are being executed?Django,有没有办法查看正在执行的 SQL 查询?
【发布时间】:2018-06-02 13:40:29
【问题描述】:

我正在探索https://github.com/shymonk/django-datatable,它看起来不错,但我想知道它是否会查询整个数据或查询分页数据。非常需要这些信息来确定性能。

我想知道在 Django 中,有没有办法查看正在执行的底层查询是什么?

我正在使用 Django==1.11.7

【问题讨论】:

  • Django 是惰性查询,得到数据后仍然是惰性的。就像我对数据表所做的那样,搜索功能(在搜索栏中)将重新使用数据对象再次过滤
  • 谢谢,你是说数据表是加载所有数据吗?不是分页的?
  • 什么是解决这个问题的好方法?做一个单独的搜索,对吗?
  • def get_initial_queryset(self): 只定义 STANDER 查询,每个页面/搜索都会给这个查询添加一个过滤选项~> 每次重新加载数据表,它会再次查询。你可以检查它: def filter_queryset(self, qs): Let print like: print("QS - raw:", qs.query) 你会看到它

标签: python django postgresql datatable django-queryset


【解决方案1】:

如果你想查看 Django 的 ORM 生成的实际 SQL,可以打印出查询集的 .query 属性。这是我在 Django shell 中生成的名为 home 的应用程序和名为 Question 的模型的示例:

 $ python manage.py shell
(InteractiveConsole)
>>> from home.models import Question
>>> q = Question.objects.all()
>>> print(q.query)
SELECT "home_question"."id", "home_question"."date_added", "home_question"."question", "home_question"."number_of_answers" FROM "home_question"

查看django-datatable的方法,看起来过滤和分页视图是基于过滤get_queryset的结果,返回model.objects.all()

def get_queryset(self):
    model = TableDataMap.get_model(self.token)
    if model is None:
        return None
    return model.objects.all()

【讨论】:

  • 谢谢。由于数据表是我的调查兴趣,您是如何知道该函数 get_queryset 的?这是否意味着它会全部返回?然后让javascript做过滤结果?
  • @Axil 是FeedDataView 类的子类BaseListView,所以这里的get_queryset 方法会覆盖它继承的方法。但在这种情况下,我认为它确实只是返回所有对象。
  • @StuartDines 谢谢,虽然 imgur.com/a/gKr3Q DEBUG = True in settings.py 是
【解决方案2】:

查看所有已执行查询的另一种方式。

python manage.py shell
>> from django.db import connection
>> from app.models import SomeModel
>> obj = SomeModel.objects.first()
>> connection.queries
>> <Returns a list of all the queries that have been executed in the session upto this point>

这还可以让您查看已经执行了多少查询

【讨论】:

  • 当你在测试中使用它时使用@override_settings(DEBUG=True)
猜你喜欢
  • 2011-04-13
  • 2015-08-27
  • 2021-09-16
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2021-06-20
相关资源
最近更新 更多