使用“”打印 Django QuerySet SQL

Posted

技术标签:

【中文标题】使用“”打印 Django QuerySet SQL【英文标题】:Printing Django QuerySet SQL with "" 【发布时间】:2011-12-28 02:13:53 【问题描述】:

您可以按如下方式打印查询集的 SQL:

print str(queryset.query)

但是,由于某种原因,这会删除引号,因此您会得到:

SELECT `tableA`.`fieldA` FROM `fieldA` WHERE `tableA`.`fieldB` = Foo

代替:

SELECT `tableA`.`fieldA` FROM `fieldA` WHERE `tableA`.`fieldB` = "Foo"

注意缺少的""

如何纠正?

【问题讨论】:

数据库后端将查询模板和参数分别传递给您的数据库——Django 本身 从不 需要使用填充的占位符构建正确引用的查询。这就是为什么你只能得到这个不完整的解决方案来进行调试。 【参考方案1】:

如果底层数据库是PostgreSQL,你可以这样做:

from django.db import connection
sql, params = queryset.query.sql_with_params()
cursor = connection.cursor()
cursor.mogrify(sql, params)

sql_with_params 返回未替换任何值的普通查询以及将插入查询中的参数。

仍然建议将.mogrify() 用于除调试以外的其他目的,因为该方法将来可能会消失。

如果你想执行查询,你可以/应该只使用.raw()

YourModel.objects.raw(sql, params)

【讨论】:

【参考方案2】:

如果这是出于调试目的,您应该查看 django-debug-toolbar,它将显示为您正在查看的任何视图运行的所有查询

【讨论】:

【参考方案3】:

不是你想要的,但如果你有DEBUG = True,你可以使用

from django.db import connection
connection.queries

更新:

Queryset__str__方法:

__str__(self)
|      Returns the query as a string of SQL with the parameter values
|      substituted in.
|      
|      Parameter values won't necessarily be quoted correctly, since that is
|      done by the database interface at execution time.

【讨论】:

这仅在发送查询后才有效,而我需要在之前打印它以防提取出现问题

以上是关于使用“”打印 Django QuerySet SQL的主要内容,如果未能解决你的问题,请参考以下文章

Django学习之model进阶

在Django QuerySet上计算vs len

django

神奇的双下划线查询

DJango filter_queryset

Django 'QuerySet' 对象没有使用 modelform 的属性'split'