2010-01-25 11 views
8

Tôi đã có một ứng dụng Python/Django chạy khá nhiều câu lệnh SQL. Đối với các mục đích gỡ lỗi, tôi nghĩ rằng tôi nên tạo một khung nhìn đơn giản cho tôi mà chỉ liệt kê tất cả các câu lệnh SQL đã được chạy.Sử dụng django.db.connection.queries

Theo tài liệu, mã này sẽ đủ để làm điều đó:

from django.db import connection 
    connection.queries 

miễn là DEBUG là True.

Tuy nhiên, điều này không mang lại cho tôi bất cứ điều gì. DEBUG chắc chắn được đặt thành True. Trong những bối cảnh này connection.queries này được lưu trữ? Tôi có nghĩa là, tôi sẽ có thể thực hiện một trang mà thực hiện rất nhiều câu lệnh SQL, và sau đó chỉ cần chuyển sang xem http://myserver/sql tôi tạo ra và xem những câu lệnh SQL ở đó, phải không? Sử dụng cùng một phiên trình duyệt của khóa học ...

Tôi đã kiểm tra xem db.reset_queries() có đang chạy ở bất kỳ đâu trong mã không, có vẻ như không.

Bất kỳ ý tưởng nào tại sao connection.queries luôn trống?

Trả lời

17

Ben đúng là bạn chỉ thấy các truy vấn từ quy trình hiện tại. Bạn có thể sử dụng nó trong cùng một chế độ xem hoặc trong bảng điều khiển chứ không phải giữa các chế độ xem.

Cách tốt nhất để xem truy vấn nào đang thực hiện trong chế độ xem của bạn là sử dụng Django debug toolbar.

+0

Tôi sẽ xem thanh công cụ gỡ lỗi django. Cảm ơn bạn. – HaukurHaf

+0

Tôi chưa bao giờ thành công khi chạy DDT trên máy chủ sản xuất. Nó chỉ có vẻ làm việc với máy chủ phát triển của Django chạy cục bộ. – William

3

Tôi nghĩ rằng các truy vấn này được lưu trữ trong bộ nhớ và không được chia sẻ giữa các quy trình, do đó bạn sẽ chỉ có quyền truy cập vào các truy vấn được thực hiện bởi quy trình hiện tại.

Nếu tôi thử mã mà bạn đã dán trong phiên ./manage.py shell, tôi chỉ thấy các truy vấn mà trước đây tôi đã thực hiện trong phiên trình bao đó.

Nếu tôi vượt qua queries từ chế độ xem vào ngữ cảnh mẫu và hiển thị nó trong mẫu, tôi chỉ thấy các truy vấn được thực hiện trong chế độ xem đó. Tuy nhiên, điều này đang sử dụng máy chủ dev.

Tôi giả sử — nhưng chưa thử nghiệm — nếu bạn sử dụng trong môi trường nơi bạn có một quá trình phân phối nhiều yêu cầu, bạn sẽ thấy nhiều truy vấn hơn được lưu mỗi yêu cầu.

+0

Ok, vì vậy, điều này sẽ chỉ hoạt động trong mỗi yêu cầu. Điều đó có ý nghĩa. Cảm ơn bạn đã chỉ ra rằng :-) – HaukurHaf

7

@Daniel Roseman của nó là một ý tưởng tốt, nhưng nếu bạn muốn biết câu truy vấn sql out of the box:

cài đặt django-command-extensions và thêm nó vào các ứng dụng được cài đặt. nó sẽ thêm nhiều lệnh utils vào dự án của bạn, một trong số họ:

  • debugsqlshell: Đầu ra của SQL mà được thực hiện khi bạn làm việc trong vỏ tương tác Python.

dụ: python manage.py debugsqlshell

In [1]:from django.contrib.auth.models import User 
In [1]:User.objects.all() 

Out[2]: SELECT "auth_user"."id", 
    "auth_user"."username", 
    "auth_user"."first_name", 
    "auth_user"."last_name", 
    "auth_user"."email", 
    "auth_user"."password", 
    "auth_user"."is_staff", 
    "auth_user"."is_active", 
    "auth_user"."is_superuser", 
    "auth_user"."last_login", 
    "auth_user"."date_joined" 
    FROM "auth_user" LIMIT 21 [1.25ms] 
2
from django.db import connections 
x = connections['rating'] 
x.queries 

So check another connections! 
0

Đó là những gì cố định nó cho tôi; Tôi đã sử dụng:

reduce(lambda n, name: n + connections[name].queries, connections, 0) 

để nhận số truy vấn.

Các vấn đề liên quan