บันทึกการสืบค้น sql ทั้งหมด


98

ฉันจะบันทึกการสืบค้น SQL ทั้งหมดที่แอปพลิเคชัน django ของฉันดำเนินการได้อย่างไร

ฉันต้องการบันทึกทุกอย่างรวมถึง SQL จากไซต์ผู้ดูแลระบบ ฉันเห็นคำถามนี้และคำตอบ FAQแต่ยังคิดไม่ออกว่าควรใส่ที่ไหน

from django.db import connection
connection.queries

เพื่อบันทึกทุกอย่างเป็นไฟล์เดียว?

คำถามของฉันคือ - ฉันจะทำอย่างไรเพื่อให้มีไฟล์ (พูดว่า all-sql.log) ที่บันทึกคำสั่ง SQL ทั้งหมด


คำตอบ:


19

บางทีลองดูhttps://github.com/django-debug-toolbar/django-debug-toolbar

จะช่วยให้คุณเห็นข้อความค้นหาทั้งหมดที่สร้างขึ้นโดยหน้าเว็บหนึ่ง ๆ เช่นเดียวกับสแต็กเทรซที่เกิดขึ้นเป็นต้น

แก้ไข: เพื่อบันทึกการสืบค้น SQL ทั้งหมดลงในไฟล์ ฯลฯ จากนั้นคุณจะต้องสร้างมิดเดิลแวร์ มิดเดิลแวร์ทำงานทุกคำขอ มีตัวอย่าง Django หลายรายการสำหรับสิ่งนี้:

ผู้ที่เกี่ยวข้องกับการพิมพ์ไปยังเทอร์มินัล แต่คงไม่ยากที่จะปรับให้เข้ากับไลบรารีการบันทึกของ python


177

รวมข้อมูลโค้ดต่อไปนี้กับLOGGINGฟิลด์ในของคุณ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'],
        }
    }
}

ปรับแต่งจากคำตอบ @ acardenas89


3
คุณอาจต้องเพิ่มสิ่งต่อไปนี้ในhandlersส่วนนี้ในกรณีที่คุณไม่สามารถเพิ่มตัวจัดการ 'console':ข้อผิดพลาด'console' : 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
Don Grem

1
ฉันยังต้องการ'version': 1,ในคำLOGGINGสั่ง
แดน

12
โปรดทราบว่าการดีบักต้องเป็นจริงเพื่อให้บันทึกเข้าสู่ระบบได้จริง โดยไม่คำนึงถึงการตั้งค่าการบันทึก
Janusz Skonieczny

3
Oh, และอีกหนึ่งสิ่งในการทดสอบวิ่ง Django ละเว้นการตั้งค่าและการแทนที่DEBUGไปFalseดังนั้นในการทดสอบคุณต้อง@override_settings(DEBUG=True)
Janusz Skonieczny

7
ฉันจะเพิ่ม'propagate': Falseหลัง'handlers': ['console'],บรรทัดในกรณีที่คุณเปิดใช้งาน root logger และไม่รู้ว่าทำไมถึงพิมพ์สองครั้ง ช่วยให้ฉันตระหนักรู้
Andrei-Niculae Petre

44

เพิ่มข้อความที่เป็นตัวหนาต่อไปนี้ใน settings.py


ถ้า DEBUG:
    นำเข้าบันทึก
    l = logging.getLogger ('django.db.backends')
    l.setLevel (การบันทึก DEBUG)
    l.addHandler (logging.StreamHandler ())


เข้าสู่ระบบ = {
    'เวอร์ชัน': 1,
    'disable_existing_loggers': เท็จ,
    'ตัวกรอง': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'ระดับ': 'ERROR',
            'ตัวกรอง': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }, 'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        } ,
    },
    'คนตัดไม้': {
        'django.request': {
            'handlers': ['mail_admins'],
            'ระดับ': 'ERROR',
            'เผยแพร่': จริง
        }, 'django.db.backends.sqlite3': {
            'level': 'DEBUG',
            'handlers': ['console'],
        } ,
    }
}
  

ทรัพยากร / เครดิต


9
คุณไม่จำเป็นต้องมีทั้งifข้อความที่อยู่ด้านบนและการLOGGINGเปลี่ยนแปลง ifคำสั่งสำหรับถ้าคุณต้องการที่จะเพิ่มเข้าสู่ระบบในขณะที่เช่นในเปลือกเพื่อเปิดใช้งานได้ทันที - สิ่งที่คุณต้องการใน settings.py คือLOGGINGการเปลี่ยนแปลง - และคุณดีอาจต้องการdjango.db.backendsไม่ sqlite3 หนึ่งที่เฉพาะเจาะจง
M Somerville

ฉันไม่เห็นคำถามใด ๆ บนคอนโซลที่ใช้ django 1.9 DEBUG = True.
Ciro Santilli 郝海东冠状病六四事件

1
@CiroSantilli 巴拿馬文件六四事件法轮功นี่เป็นความคิดเห็นเก่าจริงๆอาจเป็นไปได้ว่า Django 1.9 ไม่รองรับโซลูชันนี้เหมือนกัน
cevaris

ใน Django 1.9 การDEBUGตั้งค่าจะถูกบังคับให้เป็น False เมื่อทำการทดสอบ วิธีแก้ปัญหาคือการเปิดใช้งานอีกครั้งในการทดสอบ
Mouscellaneous


7

ในการบันทึกแบบสอบถาม SQL ระหว่างการทดสอบคุณต้องมีสองสิ่ง:

  1. django.db.backends คนตัดไม้เปิดใช้งานและ
  2. @override_settings(DEBUG=True) มัณฑนากร.

นักวิ่งทดสอบจะตั้งค่า DEBUG = Falseตามค่าเริ่มต้นโดยไม่สนใจสิ่งที่คุณอาจตั้งไว้ใน DJANGO_SETTINGS_MODULE

การตั้งค่าขั้นต่ำ:

# 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'],
    }
}

กรณีทดสอบตัวอย่าง:

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

คุณต้องการเพียง:

@override_settings(DEBUG=True)

หากคุณมีคำสั่งดีบัก SQL ที่พิมพ์อยู่runserverแล้ว

เพิ่มมัณฑนากรของคุณclass TestA(TestCase)หรือtest_function:

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

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

ให้เครดิตกับคำตอบของ @Janusz Skonieczny!


0

คุณต้องใส่สิ่งนี้ในแพ็คเกจมิดเดิลแวร์ มิดเดิลแวร์อยู่ระหว่างหลักเว็บเซิร์ฟเวอร์ / django และมุมมองทั้งหมดของคุณ สามารถทำการประมวลผลล่วงหน้าก่อนการร้องขอและประมวลผลภายหลังการร้องขอเสร็จสิ้น ตัวอย่างเช่นบันทึกแบบสอบถามลงในไฟล์

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