【问题标题】:Django+Raw Sql Query: See raw sql query running behind Django ORM in get methodDjango+Raw Sql Query:在 get 方法中查看 Django ORM 后面运行的原始 sql 查询
【发布时间】:2017-01-18 09:42:56
【问题描述】:

试图查看在每个 Django ORM 后面运行的 SQL 查询。

为此我正在做:

item = Item.objects.filter(Id=8177).query

这里我使用过滤器来获取多个 fetch。上面的查询给了我想要的输出。

现在问题开始了,当我尝试使用 get API 时

item = Item.objects.get(Id=8177).query

它获取一条记录,然后尝试查看在 Django ORM 后面运行的原始 SQL 查询,然后显示如下:

AttributeError: 'Item' 对象没有属性 'query'

Django 不支持查看获取 API 的原始 SQL 查询吗?可能是我错了。有人可以分享一些想法吗?

【问题讨论】:

标签: django django-models django-orm


【解决方案1】:

如果您不想配置 LOGGING,可以使用django.db.connection.queries 来检查数据库查询:

from django import db
from app.models import MyModel

MyModel.objects.get(id=1)
print db.connection.queries

>>> [{'sql': 'Your query here', 'time': '0.001'}]

顺便说一下,get 方法使用 filter 和来自 _result_cache 的切片并返回此切片。有时它也会将order_by 应用于查询集。因此,您几乎总是可以通过检查具有相同参数的 filter 方法的查询来预测您的 SQL。

【讨论】:

  • 感谢回复,对查询结果集有影响吗?
  • 不,如果我理解你的话。该列表仅包含已执行的查询,就好像您通过将 str(query) 附加到某个任意列表来自己存储它们一样
  • 谢谢。知道了。真的很有帮助
【解决方案2】:

在您的日志记录配置的loggers 部分添加一个名为django.db 的记录器。将其级别设置为DEBUG,并将其处理程序设置为您要使用的任何处理程序。如果您希望日志显示在测试服务器启动屏幕本身,请使用处理程序console。确保您的 Django 应用程序正在调试模式下运行。

示例配置:

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'verbose': {
                'format': '[%(thread)d %(threadName)s %(process)d %(processName)s][%(asctime)s] %(levelname)s [%(name)s %(filename)s:%(lineno)s in %(funcName)s] %(message)s'
            }
        },
        'handlers': {
            'console': {
                'class': 'logging.StreamHandler',
                'formatter': 'verbose',
            }
        },
        'loggers': {
            'django.db': {
                'handlers': ['console'],
                'level': 'DEBUG',
                'propagate': False,
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2018-05-15
    • 2019-08-05
    • 2022-08-18
    • 2019-06-11
    • 2015-11-21
    • 2012-03-16
    • 1970-01-01
    • 2013-04-17
    • 2021-09-23
    相关资源
    最近更新 更多