Làm cách nào để xem truy vấn SQL tương ứng của bộ truy vấn của Django ORM?


164

Có cách nào để tôi có thể in truy vấn mà Django ORM đang tạo không?

Nói rằng tôi thực hiện câu lệnh sau: Model.objects.filter(name='test')

Làm cách nào để xem truy vấn SQL được tạo?

Câu trả lời:


178

Mỗi đối tượng Queryset có một querythuộc tính mà bạn có thể đăng nhập hoặc in ra thiết bị xuất chuẩn cho mục đích gỡ lỗi.

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

Biên tập

Tôi cũng đã sử dụng các thẻ mẫu tùy chỉnh (như được nêu trong đoạn trích này ) để đưa ra các truy vấn trong phạm vi của một yêu cầu dưới dạng nhận xét HTML.


6
những gì về truy vấn cho .save ()?
DataGreed

@DataGreed Câu hỏi hay, có thể đáng để hỏi trong một chủ đề mới để bạn nhận được nhiều phản hồi hơn.
Joe Holloway

4
Nó có hoạt động với prefetch_relatedtức là hiển thị 2 truy vấn không? Tôi chỉ thấy 1.
người dùng

không hoạt động. tôi thấy<django.db.models.sql.query.Query object
dopatraman

Hãy thử in (str (qs.query)). Tôi nghĩ rằng họ đã thay đổi nội bộ một chút trong 10 năm
Joe Holloway

114

Bạn cũng có thể sử dụng đăng nhập python để ghi nhật ký tất cả các truy vấn được tạo bởi Django. Chỉ cần thêm nó vào tập tin cài đặt của bạn.

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

Một phương pháp khác trong trường hợp ứng dụng đang tạo đầu ra html - thanh công cụ gỡ lỗi django có thể được sử dụng.


3
Nếu ai đó muốn có bản tóm tắt với tổng số lượng truy vấn được thực hiện cũng như tổng thời gian cần thiết: dabapps.com/blog/logging-sql-queries-django-13
andilabs

9
Nó không làm việc cho tôi, tôi phải thêm 'level': 'DEBUG'vào 'django.db'.
rvernica

108

Bạn có thể dán mã này vào trình bao của mình, nó sẽ hiển thị tất cả các truy vấn 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())


30

Có lẽ bạn nên xem qua django-debug-toolbarứng dụng, nó sẽ ghi lại tất cả các truy vấn cho bạn, hiển thị thông tin hồ sơ cho họ và nhiều hơn nữa.


3
Điều này rất hữu ích, nhưng nó chỉ hoạt động trong GUI và đôi khi bạn muốn xem nhật ký truy vấn trực tiếp trong ORM. ví dụ: bạn có một api, không có GUI!
wim

3

Một giải pháp mạnh mẽ là để máy chủ cơ sở dữ liệu của bạn đăng nhập vào một tệp và sau đó

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

2

Nếu bạn đang sử dụng định tuyến cơ sở dữ liệu, bạn có thể có nhiều hơn một kết nối cơ sở dữ liệu. Mã như thế này cho phép bạn thấy các kết nối trong một phiên. Bạn có thể đặt lại các số liệu thống kê giống như với một kết nối duy nhất: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

Bạn có thể sử dụng một Djug debug_toolbar để xem truy vấn SQL. Hướng dẫn từng bước để sử dụng debug_toolbar:

Cài đặt Debug_toolbar

pip install django-debug-toolbar

Chỉnh sửa tập tin cài đặt và thêm debug_toolbar vào các ứng dụng đã cài đặt, phần này nên được thêm vào bên dưới vào 'django.contrib.staticfiles'. Đồng thời thêm debug_toolbar vào Middleware.

Cài đặt =

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

tạo một danh sách mới có tên INTERNAL_IPS trong tệp settings.txt

Cài đặt = = tạo danh sách mới ở cuối tệp cài đặt và thêm danh sách bên dưới:

INTERNAL_IPS= [127.0.0.1']

Điều này sẽ cho phép gỡ lỗi chỉ chạy trên máy chủ phát triển nội bộ

Chỉnh sửa tệp urls.py của #Project & thêm mã bên dưới:

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

áp dụng di chuyển và chạy lại máy chủ

Bạn sẽ thấy một tiện ích bổ sung trên trang web của mình tại 127.0.0.1 và nếu bạn nhấp vào hộp kiểm Truy vấn SQL, bạn thực sự có thể thấy thời gian chạy của truy vấn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.