0

Django (1.3) Web アプリケーションの SQL パフォーマンスを分析しようとしています。にアタッチしdjango.db.backendsて設定するカスタム ログ ハンドラーを追加しましたDEBUG = True。これにより、実行中のすべてのデータベース クエリを確認できます。

ただし、SQL は有効な SQL ではありません。実際のクエリにはselect * from app_model where name = %sいくつかのパラメーターが渡されていますが (例: "admin")、ログ メッセージはパラメーターを引用していないため、SQL はselect * from app_model where name = adminであり、これは間違っています。これは、 を使用しても発生しdjango.db.connection.queriesます。私の知る限り、django デバッグ ツールバーには、これを処理するための複雑なカスタム カーソルがあります。

更新Django デバッグ ツールバーを提案する場合: 私はそのツールを認識しています。しかし、それは私が必要とすることをしません。アプリケーションのサンプル インタラクションを実行し、使用されている SQL を集計したいと考えています。DjDT は、表示と浅い学習に最適です。しかし、数十ページの相互作用を集約および要約するにはあまり適していません。

実行されている本物の正当な SQL を取得する簡単な方法はありますか?

4

4 に答える 4

2

django-debug-toolbar をチェックしてください。ページを開くと、サイドバーにすべての SQL クエリとその他の情報が表示されます。

于 2013-01-28T17:02:22.077 に答える
0

すべての QuerySet オブジェクトには「クエリ」属性があります。あなたが望むことを行う1つの方法(おそらく理想的ではないことを受け入れます)は、Djangoのテストクライアントを使用して、各ビューが生成するルックアップを一種のスクリプト化されたユーザーストーリーにチェーンすることです。ユーザーストーリーに含まれるルックアップごとに、たとえば、最後に記述するファイルのようなオブジェクトにクエリを追加するだけです(簡潔にするためにリストを使用します)。

l = []
o = Object.objects.all()
l.append(o.query)
于 2013-01-28T17:02:27.163 に答える
0

select * from app_model where name = %s準備されたステートメントです。ステートメントとパラメーターを別々にログに記録することをお勧めします。整形式のクエリを取得するには、 のようなこと"select * from app_model where name = %s" % quote_string("user")か、より一般的なことを行う必要がありますquery % map(quote_string, params)

quote_string は DB 固有であり、DB 2.0 API は quote_string メソッドを定義していないことに注意してください。したがって、自分で作成する必要があります。ロギングの目的で、実際の値を考慮せずにクエリを簡単にグループ化できるため、はるかに優れたプロファイリングが可能になるため、クエリとパラメーターを別々にしておくことをお勧めします。

于 2013-01-28T17:18:13.517 に答える
0

Django Docs は、この誤った引用は SQLite でのみ発生すると述べています。

https://docs.djangoproject.com/en/dev/ref/databases/#sqlite-connection-queries

別のデータベース エンジンを試しましたか?

于 2013-01-28T17:27:35.590 に答える