尝试查看每个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,
}
}
}