Apakah ada cara untuk menunjukkan SQL bahwa Django sedang berjalan saat melakukan query?
307
Lihat FAQ dokumen: " Bagaimana saya bisa melihat query SQL mentah yang dijalankan Django? "
django.db.connection.queries
berisi daftar kueri SQL:
from django.db import connection
print(connection.queries)
Querysets juga memiliki query
atribut yang berisi kueri yang akan dieksekusi:
print(MyModel.objects.filter(name="my name").query)
Perhatikan bahwa output kueri tidak valid SQL, karena:
"Django tidak pernah benar-benar menginterpolasi parameter: ia mengirimkan permintaan dan parameter secara terpisah ke adaptor basis data, yang melakukan operasi yang sesuai."
Dari laporan bug Django # 17741 .
Karena itu, Anda tidak boleh mengirim output permintaan langsung ke database.
str()
fungsi Pythonian yang ditentukan dan dibangun , yang memanggil__str__()
metode internal . misalnyastr(MyModel.objects.filter(name="my name").query)
saya juga akan merekomendasikan menggunakan IPython dan shell Django dari proyek Anda. Tab selesai kemudian memberikan introspeksi objek. Karena Django dikenal dengan skema penamaan yang tegas, metodologi ini cenderung sangat berguna.query
tidak valid SQL, karena "Django tidak pernah benar-benar menginterpolasi parameter: ia mengirimkan permintaan dan parameter secara terpisah ke adaptor database, yang melakukan operasi yang sesuai." Sumber: code.djangoproject.com/ticket/17741stable
, bukandev
, untuk menaut ke versi Django saat ini, seperti ini: docs.djangoproject.com/en/stable/faq/models/…Django-ekstensi memiliki perintah shell_plus dengan parameter
print-sql
Dalam django-shell semua query yang dieksekusi akan dicetak
Ex.:
sumber
Lihatlah debug_toolbar , ini sangat berguna untuk debugging.
Dokumentasi dan sumber tersedia di http://django-debug-toolbar.readthedocs.io/ .
sumber
sumber
m = MyModel.objects.get(...)
diikuti olehm.query
m
bukan queryset lagi. Gunakanq = MyModel.objects.filter(...)
, laluq.query
, lalum = q.get()
.Tidak ada jawaban lain yang mencakup metode ini, jadi:
Sejauh ini saya menemukan metode yang paling berguna, sederhana, dan dapat diandalkan untuk menanyakan basis data Anda. Misalnya di Linux untuk Postgres yang mungkin Anda lakukan:
Setiap basis data akan memiliki prosedur yang sedikit berbeda. Dalam log basis data Anda tidak hanya akan melihat SQL mentah, tetapi juga pengaturan koneksi atau django overhead transaksi yang ditempatkan pada sistem.
sumber
log_statement='all'
dalampostgresql.conf
untuk metode ini.postgresql.conf
dengan menjalankanpsql -U postgres -c 'SHOW config_file'
Meskipun Anda dapat melakukannya dengan kode yang disediakan, saya menemukan bahwa menggunakan aplikasi bilah alat debug adalah alat yang hebat untuk menampilkan kueri. Anda dapat mengunduhnya dari github di sini .
Ini memberi Anda opsi untuk menampilkan semua kueri yang berlari pada halaman tertentu bersamaan dengan waktu untuk kueri. Itu juga meringkas jumlah pertanyaan pada halaman bersama dengan total waktu untuk tinjauan cepat. Ini adalah alat yang hebat, ketika Anda ingin melihat apa yang dilakukan ORANG Django di belakang layar. Ini juga memiliki banyak fitur bagus lainnya, yang dapat Anda gunakan jika Anda suka.
sumber
Opsi lain, lihat opsi masuk dalam pengaturan.py yang dijelaskan oleh posting ini
http://dabapps.com/blog/logging-sql-queries-django-13/
debug_toolbar memperlambat setiap pemuatan halaman di server dev Anda, logging tidak jadi lebih cepat. Keluaran dapat dibuang ke konsol atau file, sehingga UI tidak sebaik. Tetapi untuk tampilan dengan banyak SQL, perlu waktu lama untuk debug dan mengoptimalkan SQL melalui debug_toolbar karena setiap halaman memuat sangat lambat.
sumber
Jika Anda memastikan file settings.py Anda memiliki:
django.core.context_processors.debug
tercantum dalamCONTEXT_PROCESSORS
DEBUG=True
IP
diINTERNAL_IPS
tupleMaka Anda harus memiliki akses ke
sql_queries
variabel. Saya menambahkan catatan kaki ke setiap halaman yang terlihat seperti ini:Saya mendapatkan variabel
sql_time_sum
dengan menambahkan bariske fungsi debug di django_src / django / core / context_processors.py.
sumber
Saya mengembangkan ekstensi untuk tujuan ini, sehingga Anda dapat dengan mudah menempatkan dekorator pada fungsi tampilan Anda dan melihat berapa banyak kueri yang dieksekusi.
Untuk memasang:
Untuk digunakan sebagai manajer konteks:
Untuk digunakan sebagai dekorator:
Github: https://github.com/rabbit-aaron/django-print-sql
sumber
Saya percaya ini harus bekerja jika Anda menggunakan PostgreSQL:
sumber
Berikut ini mengembalikan kueri sebagai SQL yang valid, berdasarkan https://code.djangoproject.com/ticket/17741 :
sumber
Saya telah membuat cuplikan kecil yang dapat Anda gunakan:
Dibutuhkan sebagai fungsi parameter (berisi kueri sql) untuk memeriksa dan berargumen, kwargs diperlukan untuk memanggil fungsi itu. Sebagai hasilnya mengembalikan fungsi apa dan mencetak permintaan SQL di konsol.
sumber
Saya menempatkan fungsi ini dalam file util di salah satu aplikasi di proyek saya:
Kemudian, ketika dibutuhkan, saya hanya mengimpornya dan menyebutnya dari konteks apa pun (biasanya tampilan) yang diperlukan, misalnya:
Sangat menyenangkan untuk melakukan ini di luar template karena jika Anda memiliki tampilan API (biasanya Django Rest Framework), itu berlaku juga di sana.
sumber
Untuk Django 2.2:
Karena sebagian besar jawaban tidak banyak membantu saya ketika menggunakan
./manage.py shell
. Akhirnya saya menemukan jawabannya. Semoga ini bisa membantu seseorang.Untuk melihat semua pertanyaan:
Untuk melihat permintaan untuk satu permintaan:
q.query
hanya menampilkan objek untukku. Menggunakan__str__()
(Representasi string) ditampilkan permintaan penuh.sumber
Lihat Query menggunakan django.db.connection.queries
Akses query SQL mentah pada objek QuerySet
sumber
Untuk menambahkan, dalam Django, jika Anda memiliki pertanyaan seperti:
melakukan:
untuk mendapatkan string sql
sumber