اذهب إلى المحتوى
  • 1

كيف يمكنني معرفة استعلامات SQL التي سيقوم جانغو Django بتنفيذها؟

Amer Abdallah

السؤال

Recommended Posts

  • 0

يوفر Django الصنف connection الذي يسمح لك بمعرفة جمل SQL التي يتم تنفيذها، كالتالي:

>>> from django.db import connection
>>> connection.queries
[{'sql': 'SELECT polls_polls.id, polls_polls.question, polls_polls.pub_date FROM polls_polls',
'time': '0.002'}]

يعرض الكود السابق جمل SQL التي تم تنفيذها مع الوقت الذي إستغرقه تنفيذ كل جملة.

لاحظ أن connection.queries متاحة فقط في حالة تم ضبط إعدادات Django وتفعيل وضع التطوير DEBUG=True

إن كان المشروع يعمل على أكثر من قاعدة بيانات، فيمكنك تحديد قاعدة البيانات بالطريقة التالية:

>>> from django.db import connections
>>> connections['DATABASE_NAME'].queries

في حالة أردت حذف سجل جمل SQL هذا فيمكنك أن تستعمل الدالة reset_queries:

from django.db import reset_queries
reset_queries()

كما أن Querysets لديها الخاصية query التي تمكنك من عرض جملة SQL قبل تنفيذها، كالتالي:

print(User.objects.filter(role="admin").query)

لاحظ أيضًا أن جمل SQL الناتجة عن هذه العملية قد لا تكون صحيح مع جميع أنواع قواعد البيانات، حيث يقوم Django بإرسال جملة SQL مع القيم بشكل منفصل، وهذا الأمر تم توضيحه في توثيق Django:

اقتباس

"Django never actually interpolates the parameters: it sends the query and the parameters separately to the database adapter, which performs the appropriate operations."

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

إجابة سامح رائعة، إليك طريقة أخرى بسيطة وسهلة:

Q = Query.objects.values('v1','v2','vn')
print(Q.query)

حيث أنه تم تضمين الاستعلام فعلياً في واجهة برمجة تطبيقات النماذج. وكحل آخر فإن امتدادات Django لها أمر shell_plus مع معامل print-sql :

./manage.py shell_plus --print-sql

في django-shell ستتم طباعة جميع الاستعلامات المنفذة، على سبيل المثال:

User.objects.get(pk=1)
SELECT "auth_user"."id",
       "auth_user"."password",
       ..
       ..
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
FROM "auth_user"
WHERE "auth_user"."id" = 1
Execution time: 0.002466s [Database: default]
<User: username>

بالنسبة لهذه الطريقة إن لم تعمل معك فيجب أن تقوم بضبط DEBUG = True  في ملف settings.py.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...