Django ORM sorgu kümesinin karşılık gelen SQL sorgusu nasıl görüntülenir?


164

Django ORM üreten sorguyu yazdırabilirsiniz bir yolu var mı?

Aşağıdaki ifadeyi yürüttüğümü söyle: Model.objects.filter(name='test')

Oluşturulan SQL sorgusunu nasıl görebilirim?

Yanıtlar:


178

Her QuerySet nesnesinin queryhata ayıklama amacıyla günlüğe kaydedebileceğiniz veya stdout'a yazdırabileceğiniz bir özniteliği vardır.

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

Düzenle

Ayrıca HTML şablonu olarak tek bir istek kapsamındaki sorguları enjekte etmek için ( bu snippet'te belirtildiği gibi) özel şablon etiketleri kullandım .


6
.save () için sorgular ne olacak?
DataGreed

@DataGreed İyi soru, daha fazla yanıt almak için yeni bir iş parçacığında sormaya değer olabilir.
Joe Holloway

4
prefetch_relatedYani 2 sorgu göster ile çalışır mı ? Sadece 1'i görüyorum.
kullanıcı

çalışmıyor. i see<django.db.models.sql.query.Query object
dopatraman

Yazdırmayı deneyin (str (qs.query)). Sanırım
Joe Holloway

114

Django tarafından oluşturulan tüm sorguları günlüğe kaydetmek için python günlüğünü de kullanabilirsiniz. Bunu ayarlar dosyanıza eklemeniz yeterlidir.

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

Uygulama html çıktısı üretiyorsa başka bir yöntem - django hata ayıklama araç çubuğu kullanılabilir.


3
Biri olmasını istiyorsanız Sumup ile özet arasında yürütülen sorgu sayısı sıra toplam süre o aldı: dabapps.com/blog/logging-sql-queries-django-13
andilabs

9
Benim için işe yaramadı, 'level': 'DEBUG'altına eklemek zorunda kaldım 'django.db'.
rvernica

108

Bu kodu tüm SQL sorgularını görüntüleyecek olan kabuğunuza yapıştırabilirsiniz:

# 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

Belki django-debug-toolbaruygulamaya bir göz atmanız gerekir , sizin için tüm sorguları günlüğe kaydeder, onlar için profil oluşturma bilgileri ve daha fazlasını görüntüler.


3
Bu çok yararlıdır, ancak yalnızca GUI'de çalışır ve bazen doğrudan ORM'de sorgu günlüklerini görmek istersiniz. Örneğin, GUI'siz bir API'nız var!
wim

3

Sağlam bir çözüm, veritabanı sunucunuzun bir dosyaya oturum açmasını ve ardından

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

2

Veritabanı yönlendirmesi kullanıyorsanız, muhtemelen birden fazla veritabanı bağlantınız vardır. Bunun gibi kod, bir oturumdaki bağlantıları görmenizi sağlar. İstatistikleri tek bir bağlantıda olduğu gibi sıfırlayabilirsiniz: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

SQL sorgusunu görüntülemek için bir Django debug_toolbar kullanabilirsiniz. Debug_toolbar kullanımı için adım adım kılavuz:

Debug_toolbar'ı yükleyin

pip install django-debug-toolbar

Settings.py dosyasını düzenleyin ve Yüklü uygulamalara debug_toolbar ekleyin, bu 'django.contrib.staticfiles' klasörüne eklenmelidir. Ayrıca Middleware'e debug_toolbar ekleyin.

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

settings.py dosyasında INTERNAL_IPS adlı yeni bir liste oluşturun

Settings.py dosyasının sonunda Settings.py => yeni liste oluştur & aşağıdaki listeye ekle:

INTERNAL_IPS= [127.0.0.1']

Bu, hata ayıklamanın yalnızca dahili geliştirme sunucusunda çalışmasına izin verir

#Project öğesinin urls.py dosyasını düzenleyin ve aşağıdaki kodu ekleyin:

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

taşı ve çalıştır sunucusunu tekrar uygula

127.0.0.1'de web sayfanızda bir eklenti göreceksiniz ve SQL Sorgusu onay kutusuna tıklarsanız, sorgunun çalışma zamanını da görebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.