Django,有什么方法可以查看正在执行的SQL查询吗?

4

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

我想知道在Django中,有没有一种方法可以查看正在执行的底层查询?

我正在使用Django==1.11.7


Django是惰性查询,即使获取了数据后仍然保持惰性。就像我在datatable中所做的那样,搜索功能(在搜索栏中)将重复使用数据对象进行过滤。 - Nam Nguyễn
谢谢,你的意思是使用datatable会加载所有数据?而不是分页的数据? - Axil
有什么好的方法来解决这个问题吗?要单独进行搜索,然后对吧? - Axil
def get_initial_queryset(self): 定义标准查询,每个页面/搜索都将向该查询添加过滤选项~>每次datatable重新加载时,它都会再次查询。 您可以在以下位置进行检查:def filter_queryset(self, qs): 以以下方式打印:print(“QS-raw:”,qs.query),然后您将看到它。 - Nam Nguyễn
可能是如何查看Django运行的原始SQL查询?的重复问题。 - cezar
cezar,谢谢。这正是我在寻找的! - Axil
2个回答

4
如果你想查看 Django ORM 生成的实际 SQL,你可以打印 queryset 的 .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()

3
文档可以在 https://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running 找到。 - Stuart Dines
谢谢。由于数据表是我感兴趣的研究领域,你是怎么知道 get_queryset 函数的呢?这是否意味着它返回所有结果?然后让 JavaScript 进行筛选? - Axil
@Axil FeedDataView 类是 BaseListView 的子类,因此这里的 get_queryset 方法覆盖了它继承的方法。但在这种情况下,我认为它只是简单地返回所有对象。 - briancaffey
@StuartDines 谢谢,但我无法让它工作 https://imgur.com/a/gKr3Q 在settings.py中DEBUG = True - Axil

3

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

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>

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


3
在测试中使用时,请使用@override_settings(DEBUG=True) - yofee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接