Django+Raw Sql查询:查看运行在Django ORM后面的get方法中的Raw Sql查询



尝试查看每个Django ORM背后运行的SQL查询。

我要做的是:

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

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

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

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

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

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

Django不支持查看get API的原始SQL查询吗?也许我错了。有人能分享一些想法吗?

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

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的切片,并返回该切片。有时它也对queryset应用order_by。因此,您几乎可以通过检查具有相同参数的filter方法的查询来预测SQL。

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

示例配置:

    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,
            }
        }
    }

最新更新