2016-09-10 7 views
1

各Django ORMの背後で実行されているSQLクエリを表示しようとしています。このためDjango + Raw SQLクエリ:取得メソッドでDjango ORMの背後で実行されているraw SQLクエリを表示

私がやっている:私は、複数のfetch.Aboveクエリを取得するには、フィルタを使用しています。ここ

item = Item.objects.filter(Id=8177).query 

は私に所望の出力を提供します。

今、問題が開始されると、私はAPI

item = Item.objects.get(Id=8177).query 

を取得使用しようとしていますときには、単一のレコードは、その後、DjangoのORMの後ろに実行している生のSQLクエリを確認しようと、それは次のように表示さフェッチ:

AttributeError: 'Item'オブジェクトに 'query'属性がありません

get APIのRaw SQLクエリを表示するDjangoのサポートはありませんか?私は間違っているかもしれません。

+0

SQLクエリのログ記録を設定することを検討しましたか? http://stackoverflow.com/a/20161527/3191896 –

+0

はい。これが設定されています – Sandy

答えて

1

ロギングを設定したくない場合は、DBクエリをチェックするためにdjango.db.connection.queriesを使用することができます:ところで

from django import db 
from app.models import MyModel 

MyModel.objects.get(id=1) 
print db.connection.queries 

>>> [{'sql': 'Your query here', 'time': '0.001'}] 

get方法からスライスにfilterを使用して、フードの下に_result_cacheを置き、このスライスを返します。また、クエリーセットにorder_byを適用することもあります。したがって、同じ引数でfilterメソッドのクエリをチェックすることによって、ほとんどの場合、SQLを予測できます。

+0

応答ありがとうございます。クエリ結果セットに影響しますか? – Sandy

+0

いいえ、あなたを理解していれば。このリストには、実行されたクエリが格納されています。これは、str(クエリ)をいくつかの仲裁リストに追加することで、それらを保存するかのように実行されます。 – valignatev

+0

ありがとうございます。 – Sandy

0

ログ設定のloggersセクションに、名前がdjango.dbのロガーを追加します。そのレベルをDEBUGに設定し、そのハンドラを使用するハンドラに設定します。ログをテストサーバーの起動画面自体に表示する場合は、ハンドブックconsoleを使用してください。あなたのDjangoアプリがDEBUGモードで動作していることを確認してください。

例の設定:

LOGGING = { 
     'version': 1, 
     'disable_existing_loggers': False, 
     'formatters': { 
      'verbose': { 
       'format': '[%(thread)d %(threadName)s %(process)d %(processName)s][%(asctime)s] %(levelname)s [%(name)s %(filename)s:%(lineno)s in %(funcName)s] %(message)s' 
      } 
     }, 
     'handlers': { 
      'console': { 
       'class': 'logging.StreamHandler', 
       'formatter': 'verbose', 
      } 
     }, 
     'loggers': { 
      'django.db': { 
       'handlers': ['console'], 
       'level': 'DEBUG', 
       'propagate': False, 
      } 
     } 
    } 
関連する問題