【发布时间】:2011-03-29 07:39:43
【问题描述】:
在过去的 django 版本中,您可以构建一个查询集,然后对其执行 .as_sql() 以找出最终查询。
在 Django 1.2.1 中有一个函数 ._as_sql() 返回类似但不一样的东西。
在过去的版本中:
qs=Model.objects.all()
qs.as_sql() ====>
SELECT `model_table.id`, `model_table.name`, `model_table.size` from model_table
这向我展示了很多信息。
但是如果我在 Django 1.2.1 中尝试一下
from django.db import connections
con=connections['default']
qs=Model.objects.all()
qs._as_sql(con) ====>
SELECT U0.`id` from model_table U0
这并没有告诉我实际选择了哪些字段。我知道这些信息在某处可用,因为在模板中,我仍然可以这样做:
{% for q in sql_queries %}
{{q.time}} - {{q.sql}}
{% endfor %}
它向我显示了查询的完整版本(包括选定的字段)
我的问题是,我怎样才能在 shell 中获得这个完整版本?
【问题讨论】:
-
SELECT U0.'id' from model_table U0如何不显示正在选择的字段?正在选择 model_table.id。如果使用与您的第一个查询相同的三个字段,它将看起来像SELECT U0.'id', U0.'name', U0.'size' from model_table U0。 -
我认为仅仅选择 id 是不够的。稍后实际发生的是正在选择完整信息。例如 qs=Model.objects.select_related().all() qs._as_sql(con) =====> SELECT U0.
idfrom model_table U0 显然这不是select_related的预期功能,对吧? -
我需要它的原因是因为我正在尝试调试一个将 defer / 仅与注释结合的查询,而我可以看到 django 生成的唯一 sql 是新的 'select id' 类型的东西实际上没有查看它尝试选择的字段。
-
另见groups.google.com/group/django-users/msg/47ab48453367fdd9,其中提到了多数据库案例。