วิธีการดูแบบสอบถาม SQL ที่สอดคล้องกันของชุดแบบสอบถามของ Django ORM?


164

มีวิธีที่ฉันสามารถพิมพ์คิวรี่ที่ Django ORM กำลังสร้างได้หรือไม่?

ว่าฉันรันคำสั่งต่อไปนี้: Model.objects.filter(name='test')

ฉันจะดูแบบสอบถาม SQL ที่สร้างขึ้นได้อย่างไร

คำตอบ:


178

วัตถุ QuerySet แต่ละรายการมีqueryแอตทริบิวต์ที่คุณสามารถบันทึกหรือพิมพ์ไปยัง stdout เพื่อการดีบัก

qs = Model.objects.filter(name='test')
print qs.query

แก้ไข

ฉันยังใช้แท็กแม่แบบกำหนดเอง (ตามที่ระบุไว้ในตัวอย่างนี้ ) เพื่อฉีดแบบสอบถามในขอบเขตของคำขอเดียวเป็นความคิดเห็น HTML


6
สิ่งที่เกี่ยวกับการค้นหาสำหรับ. save ()?
DataGreed

@DataGreed คำถามที่ดีอาจคุ้มค่าที่จะถามในเธรดใหม่เพื่อให้คุณได้รับคำตอบเพิ่มเติม
Joe Holloway

4
มันใช้งานได้กับprefetch_relatedเช่นแสดง 2 แบบสอบถาม? ฉันเห็นเพียง 1.
ผู้ใช้

ไม่ทำงาน ฉันเห็น<django.db.models.sql.query.Query object
dopatraman

ลองพิมพ์ (str (qs.query)) ฉันคิดว่าพวกเขาได้เปลี่ยน internals เล็กน้อยใน 10 ปี
Joe Holloway

114

คุณยังสามารถใช้การบันทึกหลามเพื่อบันทึกการสืบค้นทั้งหมดที่สร้างโดย 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ได้


3
ถ้าใครอยากมีบทสรุปกับ SumUpของจำนวนแบบสอบถามดำเนินการเช่นเดียวกับเวลาทั้งหมดที่มันต้องใช้เวลา: dabapps.com/blog/logging-sql-queries-django-13
andilabs

9
มันไม่ได้ทำงานสำหรับฉันฉันมีการเพิ่มภายใต้'level': 'DEBUG' 'django.db'
rvernica

108

คุณสามารถวางรหัสนี้บนเปลือกของคุณซึ่งจะแสดงแบบสอบถาม 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())

72

ตราบใดDEBUGที่:

from django.db import connection
print(connection.queries)

สำหรับแบบสอบถามแต่ละรายการคุณสามารถทำได้:

print(Model.objects.filter(name='test').query)

22
หมายเหตุถึงผู้อ่าน: queryส่งคืนQueryวัตถุตั้งแต่ Djagno 1.2ซึ่งไม่มีas_sqlแอตทริบิวต์
Davor Lucic

30

บางทีคุณควรดูที่django-debug-toolbarแอปพลิเคชันมันจะบันทึกการสืบค้นทั้งหมดสำหรับคุณแสดงข้อมูลการทำโปรไฟล์ให้พวกเขาและอีกมากมาย


3
สิ่งนี้มีประโยชน์มาก แต่ใช้งานได้ใน GUI และบางครั้งคุณต้องการดูบันทึกการสืบค้นโดยตรงใน ORM เช่นคุณมี API ไม่มี GUI!
Wim

3

โซลูชันที่มีประสิทธิภาพคือการให้เซิร์ฟเวอร์ฐานข้อมูลของคุณล็อกไฟล์และจากนั้น

tail -f /path/to/the/log/file.log

2

หากคุณใช้การกำหนดเส้นทางฐานข้อมูลคุณอาจมีการเชื่อมต่อฐานข้อมูลมากกว่าหนึ่งรายการ รหัสเช่นนี้ช่วยให้คุณเห็นการเชื่อมต่อในเซสชัน คุณสามารถรีเซ็ตสถิติได้เช่นเดียวกับการเชื่อมต่อเดียว: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() )

1

คุณสามารถใช้ Django debug_toolbar เพื่อดูแบบสอบถาม SQL คำแนะนำทีละขั้นตอนสำหรับการใช้ debug_toolbar:

ติดตั้ง Debug_toolbar

pip install django-debug-toolbar

แก้ไขไฟล์ settings.py & เพิ่ม debug_toolbar ไปยังแอปที่ติดตั้งแล้วควรเพิ่มด้านล่างนี้เป็น 'django.contrib.staticfiles' เพิ่ม debug_toolbar ให้กับ Middleware ด้วย

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

สร้างรายการใหม่ชื่อ INTERNAL_IPS ในไฟล์ settings.py

Settings.py => สร้างรายการใหม่ที่ท้ายไฟล์ settings.py & เพิ่มรายการด้านล่าง:

INTERNAL_IPS= [127.0.0.1']

สิ่งนี้จะช่วยให้การดีบักทำงานบนเซิร์ฟเวอร์ Developement ภายในเท่านั้น

แก้ไขไฟล์ urls.py ของ #Project และเพิ่มโค้ดด้านล่าง:

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
    url(r'^__debug__/', include(debug_toolbar.urls))       
    ] + urlpatterns

ใช้การโยกย้ายและเรียกใช้เซิร์ฟเวอร์อีกครั้ง

คุณจะเห็น Add-on บนเว็บเพจของคุณที่ 127.0.0.1 และถ้าคุณคลิกที่ SQL Query กล่องกาเครื่องหมายคุณจะเห็นเวลาทำงานของแบบสอบถามด้วยเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.