ghi lại tất cả các truy vấn sql


97

Làm cách nào để ghi lại tất cả các truy vấn SQL mà ứng dụng django của tôi đã thực hiện?

Tôi muốn ghi lại mọi thứ, bao gồm cả SQL từ trang quản trị. Tôi đã thấy câu hỏi nàycâu trả lời Câu hỏi thường gặp nhưng tôi vẫn không thể tìm ra nơi tôi nên đặt

from django.db import connection
connection.queries

đăng nhập mọi thứ vào một tệp?

Vì vậy, câu hỏi của tôi là - tôi nên làm gì để có một tệp (giả sử all-sql.log) nơi tất cả các câu lệnh SQL được ghi lại?


Câu trả lời:


19

Có thể xem https://github.com/django-debug-toolbar/django-debug-toolbar

Nó sẽ cho phép bạn xem tất cả các truy vấn được tạo bởi một trang nhất định. Cũng như các dấu vết về nơi chúng xảy ra, v.v.

CHỈNH SỬA: để ghi tất cả các truy vấn SQL vào một tệp, v.v., sau đó bạn sẽ muốn tạo một số phần mềm trung gian. Phần mềm trung gian được chạy theo mọi yêu cầu. Có một số đoạn mã Django có sẵn cho loại điều này:

Những người lo lắng về việc in vào thiết bị đầu cuối, nhưng sẽ không khó để điều chỉnh họ sử dụng thư viện ghi nhật ký của python.


176

Hợp nhất đoạn mã sau với LOGGINGtrường trong settings.py:

LOGGING = {
    'version': 1,
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console'],
        }
    }
}

Đã chỉnh sửa từ @ acardenas89 answer


3
bạn có thể cần phải thêm sau vào handlersphần trong trường hợp bạn nhận được Không thể thêm handler 'console': 'console' lỗi: 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
Don Grem

1
Tôi cũng cần 'version': 1,trong LOGGINGdict.
Dan

12
Xin lưu ý rằng NỢ phải ĐÚNG để nhật ký thực sự được ghi. Bất kể cài đặt ghi nhật ký.
Janusz Skonieczny

3
Oh, và một điều nữa để trong django Á hậu kiểm tra bỏ qua cài đặt và ghi đè DEBUGđể False, vì vậy trong bài kiểm tra bạn phải@override_settings(DEBUG=True)
Janusz Skonieczny

6
Tôi cũng sẽ thêm 'propagate': Falsevào sau 'handlers': ['console'],dòng, trong trường hợp bạn đã bật trình ghi gốc và không biết tại sao điều này lại in hai lần. Để tôi nhận ra một chút.
Andrei-Niculae Petre,

44

Thêm các câu lệnh in đậm sau trong settings.py


nếu NỢ:
    nhập nhật ký
    l = logging.getLogger ('django.db.backends')
    l.setLevel (ghi nhật ký.DEBUG)
    l.addHandler (logging.StreamHandler ())


ĐĂNG NHẬP = {
    'phiên bản 1,
    'disable_existing_loggers': Sai,
    'bộ lọc': {
        'request_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'người xử lý': {
        'mail_admins': {
            'level': 'ERROR',
            'bộ lọc': ['request_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }, 'bảng điều khiển': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        } ,
    },
    'Người khai thác gỗ': {
        'django.request': {
            'trình xử lý': ['mail_admins'],
            'level': 'ERROR',
            'tuyên truyền': Đúng,
        }, 'django.db.backends.sqlite3': {
            'level': 'DEBUG',
            'handrs': ['console'],
        } ,
    }
}
  

Tài nguyên / Tín dụng


9
Bạn không cần cả ifcâu lệnh ở trên cùng và các LOGGINGthay đổi. Các iftuyên bố là vì nếu bạn muốn thêm khai thác gỗ trong khi ví dụ trong vỏ, để bật tính năng này ngay lập tức - tất cả các bạn cần trong settings.py là LOGGINGthay đổi - và bạn cũng có thể muốn django.db.backends, không phải là sqlite3 cụ thể một.
M Somerville

Tôi không thấy bất kỳ truy vấn nào trên bảng điều khiển chạy django 1.9. DEBUG = True.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 Đây là một nhận xét thực sự cũ, rất có thể Django 1.9 cũng không hỗ trợ giải pháp này.
cevaris

Trong Django 1.9, DEBUGcài đặt buộc phải là Sai khi chạy thử nghiệm. Một cách giải quyết là kích hoạt lại nó trong thử nghiệm
Điều khoản khác


7

Để ghi các truy vấn SQL trong quá trình thử nghiệm, bạn cần hai thứ:

  1. django.db.backends trình ghi nhật ký được kích hoạt và
  2. @override_settings(DEBUG=True) người trang trí.

Người chạy thử nghiệm sẽ đặt DEBUG = False theo mặc định, bỏ qua những gì bạn có thể đã đặt trong DJANGO_SETTINGS_MODULE.

Các cài đặt tối thiểu:

# https://docs.djangoproject.com/en/dev/ref/settings/#logging
LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
        },
    },
    'root': {
        'handlers': ['console'],
    }
}

Trường hợp thử nghiệm ví dụ:

from django.contrib.auth.models import User
from django.test import TestCase, override_settings


class UserTests(TestCase):

    # To log queries in tests you need to manually override DEBUG setting
    # because testing sets DEBUG=False by default

    @override_settings(DEBUG=True)
    def test_create_user(self):
        User.objects.create()

2

Bạn chỉ cần:

@override_settings(DEBUG=True)

nếu bạn đã có các câu lệnh gỡ lỗi SQL được in runserver.

Thêm trình trang trí vào của bạn class TestA(TestCase)hoặc test_function:

@override_settings(DEBUG=True)
class TestA(TestCase):
...

    @override_settings(DEBUG=True)
    def test_function(self):
    ...

Tín dụng cho câu trả lời của @Janusz Skonieczny!


0

Bạn cần đặt cái này trong một gói phần mềm trung gian. Phần mềm trung gian nằm giữa lõi máy chủ web / django và tất cả các chế độ xem của bạn. Nó có thể xử lý trước trước khi yêu cầu và xử lý sau sau khi yêu cầu hoàn thành. Ví dụ: lưu các truy vấn vào một tệp.

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.