জ্যাঙ্গো ওআরএম এর ক্যোয়ারসেটের সম্পর্কিত এসকিউএল কোয়েরিটি কীভাবে দেখুন?


164

জ্যাঙ্গো ওআরএম উত্পাদিত ক্যোয়ারীটি মুদ্রণের কোনও উপায় আছে কি?

বলুন আমি নিম্নলিখিত বিবৃতি কার্যকর করি: Model.objects.filter(name='test')

উত্পন্ন এসকিউএল কোয়েরিটি কীভাবে দেখতে পাব?

উত্তর:


178

প্রতিটি ক্যোরিসেট অবজেক্টের একটি queryবৈশিষ্ট্য রয়েছে যা আপনি লগিং করতে পারেন বা ডিবাগিংয়ের উদ্দেশ্যে stdout এ মুদ্রণ করতে পারেন।

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

সম্পাদন করা

এইচটিএমএল মন্তব্য হিসাবে একক অনুরোধের সুযোগগুলিতে ক্যোয়ারীগুলি ইনজেক্ট করতে আমি কাস্টম টেম্পলেট ট্যাগগুলি ( এই স্নিপেটে বর্ণিত হিসাবে ) ব্যবহার করেছি ।


6
.save () এর অনুসন্ধান সম্পর্কে কি?
ডেটাগ্রিড

@ ডেটাগ্রিড ভাল প্রশ্ন, একটি নতুন থ্রেডে জিজ্ঞাসা করার উপযুক্ত হতে পারে যাতে আপনি আরও প্রতিক্রিয়া পান।
জো হোলোয়

4
এটি কি prefetch_related2 কোয়েরি প্রদর্শন সঙ্গে কাজ করে ? আমি কেবল 1 টি দেখতে পাচ্ছি
ব্যবহারকারী

কাজ না। আমি দেখি<django.db.models.sql.query.Query object
দোপাট্রামন

মুদ্রণের চেষ্টা করুন (str (qs.query))। আমি মনে করি তারা 10 বছরের মধ্যে ইন্টার্নালগুলি কিছুটা বদলেছে
জো হোলোয়

114

জ্যাঙ্গোর দ্বারা উত্পন্ন সমস্ত প্রশ্নের লগ করতে আপনি পাইথন লগিং ব্যবহার করতে পারেন। এটি আপনার সেটিংস ফাইলটিতে যুক্ত করুন।

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

অ্যাপ্লিকেশন ক্ষেত্রে অন্য পদ্ধতিটি এইচটিএমএল আউটপুট তৈরি করছে - জ্যাঙ্গো ডিবাগ সরঞ্জামদণ্ড ব্যবহার করা যেতে পারে।


3
কারো আছে করতে চান তাহলে sumup সঙ্গে সারসংক্ষেপ এর মৃত্যুদন্ড কার্যকর প্রশ্নের সংখ্যা পাশাপাশি মোট সময় এটা তুলেছেন: dabapps.com/blog/logging-sql-queries-django-13
andilabs

9
এটি আমার পক্ষে কাজ করে না, আমাকে অন্তর্ভুক্ত করতে 'level': 'DEBUG'হয়েছিল 'django.db'
রাভারানিকা

108

আপনি আপনার শেলটিতে এই কোডটি পেস্ট করতে পারেন যা সমস্ত এসকিউএল কোয়েরি প্রদর্শন করবে:

# 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())

72

যতক্ষণ DEBUGচলছে:

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

একটি পৃথক প্রশ্নের জন্য, আপনি এটি করতে পারেন:

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

22
পাঠকদের জন্য নোট: ডিজেগনো ১.২০ এর পর থেকে বস্তুটি queryফেরতQuery দেয় যার as_sqlবৈশিষ্ট্য নেই।
লুভিক

30

সম্ভবত আপনার django-debug-toolbarঅ্যাপ্লিকেশনটি একবার দেখে নেওয়া উচিত , এটি আপনার জন্য সমস্ত প্রশ্নের লগ করবে, তাদের জন্য প্রোফাইলিং তথ্য প্রদর্শন করবে এবং আরও অনেক কিছু।


3
এটি খুব দরকারী, তবে এটি কেবল জিইউআইতে কাজ করে এবং কখনও কখনও আপনি সরাসরি ওআরএম-এ কোয়েরি লগগুলি দেখতে চান। যেমন আপনার একটি এপিআই আছে, কোনও জিইউআই নেই!
উইম

3

একটি শক্তিশালী সমাধান হ'ল আপনার ডাটাবেস সার্ভারটি কোনও ফাইলটিতে লগইন করা উচিত

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

2

আপনি যদি ডাটাবেস রাউটিং ব্যবহার করেন তবে আপনার কাছে সম্ভবত একাধিক ডাটাবেস সংযোগ রয়েছে। এর মতো কোড আপনাকে একটি সেশনে সংযোগগুলি দেখতে দেয়। আপনি একক সংযোগের মতো পরিসংখ্যানগুলি পুনরায় সেট করতে পারেন: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

এসকিউএল কোয়েরি দেখতে আপনি একটি জ্যাঙ্গো ডিবাগ_টুলবার ব্যবহার করতে পারেন। ডিবাগ_টুলবার ব্যবহারের জন্য ধাপে ধাপে গাইড:

ডিবাগ_টুলবার ইনস্টল করুন

pip install django-debug-toolbar

সেটিংস.পি ফাইল সম্পাদনা করুন এবং ইনস্টল করা অ্যাপ্লিকেশনগুলিতে ডিবাগ_টুলবার যুক্ত করুন, এটি নীচে 'django.contrib.staticfiles' এ যুক্ত করা উচিত। মিডওয়্যারটিতে ডিবাগ_টুলবার যুক্ত করুন।

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

সেটিংস.পাই ফাইলে ইন্টারএনএল_আইপিএস নামে একটি নতুন তালিকা তৈরি করুন

সেটিংস.পাই => সেটিংস.পি ফাইলের শেষে নতুন তালিকা তৈরি করুন এবং নীচের তালিকায় যুক্ত করুন:

INTERNAL_IPS= [127.0.0.1']

এটি ডিবাগটি কেবলমাত্র অভ্যন্তরীণ বিকাশ সার্ভারে চালানোর অনুমতি দেবে

Url.py ফাইল সম্পাদনা করুন # প্রকল্পের কোড এবং নীচে কোড যুক্ত করুন:

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

আবার মাইগ্রেট করুন এবং সার্ভার চালান

আপনি 127.0.0.1 এ আপনার ওয়েব পৃষ্ঠায় একটি অ্যাড-অন দেখতে পাবেন এবং যদি আপনি এসকিউএল কোয়েরি চেক বাক্সে ক্লিক করেন, আপনি আসলে ক্যোয়ারির রান সময়ও দেখতে পাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.