มีวิธีที่ฉันสามารถพิมพ์คิวรี่ที่ Django ORM กำลังสร้างได้หรือไม่?
ว่าฉันรันคำสั่งต่อไปนี้: Model.objects.filter(name='test')
ฉันจะดูแบบสอบถาม SQL ที่สร้างขึ้นได้อย่างไร
มีวิธีที่ฉันสามารถพิมพ์คิวรี่ที่ Django ORM กำลังสร้างได้หรือไม่?
ว่าฉันรันคำสั่งต่อไปนี้: Model.objects.filter(name='test')
ฉันจะดูแบบสอบถาม SQL ที่สร้างขึ้นได้อย่างไร
คำตอบ:
วัตถุ QuerySet แต่ละรายการมีquery
แอตทริบิวต์ที่คุณสามารถบันทึกหรือพิมพ์ไปยัง stdout เพื่อการดีบัก
qs = Model.objects.filter(name='test')
print qs.query
แก้ไข
ฉันยังใช้แท็กแม่แบบกำหนดเอง (ตามที่ระบุไว้ในตัวอย่างนี้ ) เพื่อฉีดแบบสอบถามในขอบเขตของคำขอเดียวเป็นความคิดเห็น HTML
prefetch_related
เช่นแสดง 2 แบบสอบถาม? ฉันเห็นเพียง 1.
<django.db.models.sql.query.Query object
คุณยังสามารถใช้การบันทึกหลามเพื่อบันทึกการสืบค้นทั้งหมดที่สร้างโดย Django เพียงเพิ่มสิ่งนี้ลงในไฟล์การตั้งค่าของคุณ
LOGGING = {
'disable_existing_loggers': False,
'version': 1,
'handlers': {
'console': {
# logging handler that outputs log messages to terminal
'class': 'logging.StreamHandler',
'level': 'DEBUG', # message level to be written to console
},
},
'loggers': {
'': {
# this sets root level logger to log debug and higher level
# logs to console. All other loggers inherit settings from
# root level logger.
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False, # this tells logger to send logging message
# to its parent (will send if set to True)
},
'django.db': {
# django also has database level logging
},
},
}
อีกวิธีหนึ่งในกรณีที่แอปพลิเคชันกำลังสร้างเอาต์พุต html - สามารถใช้แถบเครื่องมือดีบั๊ก debugได้
'level': 'DEBUG'
'django.db'
คุณสามารถวางรหัสนี้บนเปลือกของคุณซึ่งจะแสดงแบบสอบถาม SQL ทั้งหมด:
# To get all sql queries sent by Django from py shell
import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
ตราบใดDEBUG
ที่:
from django.db import connection
print(connection.queries)
สำหรับแบบสอบถามแต่ละรายการคุณสามารถทำได้:
print(Model.objects.filter(name='test').query)
query
ส่งคืนQuery
วัตถุตั้งแต่ Djagno 1.2ซึ่งไม่มีas_sql
แอตทริบิวต์
บางทีคุณควรดูที่django-debug-toolbar
แอปพลิเคชันมันจะบันทึกการสืบค้นทั้งหมดสำหรับคุณแสดงข้อมูลการทำโปรไฟล์ให้พวกเขาและอีกมากมาย
โซลูชันที่มีประสิทธิภาพคือการให้เซิร์ฟเวอร์ฐานข้อมูลของคุณล็อกไฟล์และจากนั้น
tail -f /path/to/the/log/file.log
หากคุณใช้การกำหนดเส้นทางฐานข้อมูลคุณอาจมีการเชื่อมต่อฐานข้อมูลมากกว่าหนึ่งรายการ รหัสเช่นนี้ช่วยให้คุณเห็นการเชื่อมต่อในเซสชัน คุณสามารถรีเซ็ตสถิติได้เช่นเดียวกับการเชื่อมต่อเดียว:reset_queries()
from django.db import connections,connection,reset_queries
...
reset_queries() # resets data collection, call whenever it makes sense
...
def query_all():
for c in connections.all():
print(f"Queries per connection: Database: {c.settings_dict['NAME']} {c.queries}")
# and if you just want to count the number of queries
def query_count_all()->int:
return sum(len(c.queries) for c in connections.all() )
คุณสามารถใช้ Django debug_toolbar เพื่อดูแบบสอบถาม SQL คำแนะนำทีละขั้นตอนสำหรับการใช้ debug_toolbar:
pip install django-debug-toolbar
Settings.py =>
INSTALLED_APPS= [ 'debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
Settings.py => สร้างรายการใหม่ที่ท้ายไฟล์ settings.py & เพิ่มรายการด้านล่าง:
INTERNAL_IPS= [127.0.0.1']
สิ่งนี้จะช่วยให้การดีบักทำงานบนเซิร์ฟเวอร์ Developement ภายในเท่านั้น
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls))
] + urlpatterns
คุณจะเห็น Add-on บนเว็บเพจของคุณที่ 127.0.0.1 และถ้าคุณคลิกที่ SQL Query กล่องกาเครื่องหมายคุณจะเห็นเวลาทำงานของแบบสอบถามด้วยเช่นกัน