【问题标题】:Printing Django QuerySet SQL with ""使用“”打印 Django QuerySet SQL
【发布时间】: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 本身 从不 需要使用填充的占位符构建正确引用的查询。这就是为什么你只能得到这个不完整的解决方案来进行调试。

标签: sql django django-queryset


【解决方案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.
      

      【讨论】:

      • 这仅在发送查询后才有效,而我需要在之前打印它以防提取出现问题
      猜你喜欢
      • 2014-02-18
      • 2019-08-05
      • 2011-04-14
      • 2012-12-26
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多