Bagaimana cara melihat kueri SQL yang sesuai dari kueryset Django ORM?

164

Apakah ada cara saya bisa mencetak kueri yang dihasilkan Django ORM?

Katakanlah saya menjalankan pernyataan berikut: Model.objects.filter(name='test')

Bagaimana saya bisa melihat permintaan SQL yang dihasilkan?

Jarvis
sumber

Jawaban:

178

Setiap objek QuerySet memiliki queryatribut yang dapat Anda log atau cetak ke stdout untuk keperluan debugging.

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

Edit

Saya juga menggunakan tag templat khusus (seperti yang diuraikan dalam cuplikan ini ) untuk menyuntikkan kueri dalam lingkup satu permintaan sebagai komentar HTML.

Joe Holloway
sumber
6
bagaimana dengan permintaan untuk .save ()?
DataGreed
@ DataGreed Pertanyaan bagus, mungkin layak ditanyakan di utas baru sehingga Anda mendapatkan lebih banyak tanggapan.
Joe Holloway
4
Apakah ini berfungsi dengan prefetch_relatedmenunjukkan 2 kueri? Saya hanya melihat 1.
pengguna
tidak bekerja saya melihat<django.db.models.sql.query.Query object
dopatraman
Coba cetak (str (qs.query)). Saya pikir mereka telah sedikit mengubah internal dalam 10 tahun
Joe Holloway
114

Anda juga bisa menggunakan python logging untuk mencatat semua permintaan yang dihasilkan oleh Django. Cukup tambahkan ini ke file pengaturan Anda.

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

Metode lain dalam aplikasi kasus adalah menghasilkan keluaran html - django debug toolbar dapat digunakan.

Aisbaa
sumber
3
Jika seseorang ingin memiliki ringkasan dengan sumup dari jumlah query dieksekusi serta total waktu yang dibutuhkan: dabapps.com/blog/logging-sql-queries-django-13
andilabs
9
Itu tidak berhasil untuk saya, saya harus menambahkan di 'level': 'DEBUG'bawah 'django.db'.
rvernica
108

Anda dapat menempelkan kode ini pada shell Anda yang akan menampilkan semua pertanyaan SQL:

# 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())
Pramod
sumber
72

Selama DEBUGaktif:

from django.db import connection
print(connection.queries)

Untuk permintaan individual, Anda dapat melakukan:

print(Model.objects.filter(name='test').query)
Daniel Roseman
sumber
22
Catatan untuk pembaca: querymengembalikan Queryobjek sejak Djagno 1.2 yang tidak memiliki as_sqlatribut.
Davor Lucic
30

Mungkin Anda harus melihat django-debug-toolbaraplikasi, itu akan mencatat semua pertanyaan untuk Anda, menampilkan informasi profil untuk mereka dan banyak lagi.

Mikhail Korobov
sumber
3
Ini sangat berguna, tetapi hanya berfungsi di GUI dan kadang-kadang Anda ingin melihat log kueri langsung di ORM. mis. Anda memiliki api, tanpa GUI!
wim
3

Solusi yang kuat adalah memiliki server database Anda log ke file dan kemudian

tail -f /path/to/the/log/file.log
alan
sumber
2

Jika Anda menggunakan perutean basis data, Anda mungkin memiliki lebih dari satu koneksi basis data. Kode seperti ini memungkinkan Anda melihat koneksi dalam satu sesi. Anda dapat mengatur ulang statistik dengan cara yang sama seperti dengan satu koneksi: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() )
Tim Richardson
sumber
1

Anda bisa menggunakan Django debug_toolbar untuk melihat kueri SQL. Panduan langkah demi langkah untuk penggunaan debug_toolbar:

Instal Debug_toolbar

pip install django-debug-toolbar

Edit file settings.py & tambahkan debug_toolbar ke Aplikasi yang sudah diinstal, ini harus ditambahkan di bawah ini ke 'django.contrib.staticfiles'. Juga tambahkan debug_toolbar ke Middleware.

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

buat daftar baru bernama INTERNAL_IPS di file settings.py

Settings.py => buat daftar baru di akhir file settings.py & tambahkan daftar di bawah ini:

INTERNAL_IPS= [127.0.0.1']

Ini akan memungkinkan debug dijalankan hanya pada server pengembangan internal

Edit file urls.py dari #Project & tambahkan kode di bawah ini:

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

terapkan migrasi & jalankan server lagi

Anda akan melihat add-on di halaman web Anda di 127.0.0.1 & jika Anda mengklik kotak centang SQL Query, Anda benar-benar dapat melihat jangka waktu kueri juga.

Devesh G
sumber