Bagaimana saya bisa mencatat semua query SQL yang dijalankan oleh aplikasi django saya?
Saya ingin mencatat semuanya, termasuk SQL dari situs admin. Saya melihat pertanyaan ini dan jawaban FAQ tetapi saya masih tidak tahu di mana saya harus meletakkan
from django.db import connection
connection.queries
memasukkan semuanya ke satu file?
Jadi pertanyaan saya adalah - apa yang harus saya lakukan untuk memiliki file (katakanlah all-sql.log) di mana semua pernyataan SQL dicatat?
Jawaban:
Mungkin lihat https://github.com/django-debug-toolbar/django-debug-toolbar
Ini akan memungkinkan Anda melihat semua kueri yang dihasilkan oleh halaman tertentu. Serta pelacakan tumpukan di mana mereka terjadi dll.
EDIT: untuk mencatat semua kueri SQL ke file dll, maka Anda akan ingin membuat beberapa middleware. Middleware dijalankan pada setiap permintaan. Ada beberapa potongan Django di luar sana untuk hal semacam ini:
Mereka prihatin dengan pencetakan ke terminal, tetapi tidak akan sulit untuk menyesuaikannya untuk menggunakan perpustakaan logging python.
sumber
Gabungkan cuplikan berikut dengan
LOGGING
bidang di Andasettings.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'], } } }
Tweak dari @ acardenas89 jawaban
sumber
handlers
bagian ini jika Anda tidak dapat menambahkan handler 'console': kesalahan 'console' :'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
'version': 1,
dalamLOGGING
dict.DEBUG
untukFalse
, sehingga dalam tes Anda harus@override_settings(DEBUG=True)
'propagate': False
setelah'handlers': ['console'],
baris, jika Anda mengaktifkan logger root dan tidak tahu mengapa ini dicetak dua kali. Butuh sedikit waktu bagiku untuk menyadari.Tambahkan pernyataan tebal berikut di settings.py
Sumber Daya / Kredit
sumber
if
pernyataan di atas danLOGGING
perubahannya. Theif
pernyataan adalah karena jika Anda ingin menambahkan logging sementara misalnya di shell, untuk menyalakannya segera - semua yang Anda butuhkan dalam settings.py adalahLOGGING
perubahan - dan Anda mungkin juga ingindjango.db.backends
, bukan satu sqlite3 tertentu.DEBUG = True
.DEBUG
pengaturan dipaksa menjadi False saat menjalankan percobaan. Solusinya adalah mengaktifkannya kembali dalam pengujianDjango 1.3 mencatat semua pernyataan SQL ke django.db.backends logger:
https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends
sumber
Untuk mencatat kueri SQL selama pengujian, Anda memerlukan dua hal:
django.db.backends
logger diaktifkan dan@override_settings(DEBUG=True)
penghias.Runner pengujian akan menyetel DEBUG = False secara default, mengabaikan apa yang mungkin telah Anda setel di DJANGO_SETTINGS_MODULE.
Pengaturan minimum:
# 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'], } }
Contoh kasus uji:
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()
sumber
Anda hanya membutuhkan:
@override_settings(DEBUG=True)
jika Anda sudah mencetak pernyataan debug SQL
runserver
.Tambahkan dekorator ke
class TestA(TestCase)
atautest_function
:@override_settings(DEBUG=True) class TestA(TestCase): ... @override_settings(DEBUG=True) def test_function(self): ...
Penghargaan untuk jawaban @Janusz Skonieczny!
sumber
Anda harus memasukkan ini ke dalam paket middleware. Middleware berada di antara webserver / inti django dan semua pandangan Anda. Ia dapat melakukan preprocessing sebelum permintaan, dan postprocessing setelah permintaan selesai. Misalnya, simpan kueri ke file.
sumber