12

かなり多くの SQL ステートメントを実行する Python/Django アプリケーションがあります。デバッグの目的で、実行されたすべての SQL ステートメントをリストする単純なビューを作成する必要があると考えました。

ドキュメントによると、このコードはそれを行うのに十分なはずです:

    from django.db import connection
    connection.queries

DEBUG が True である限り。

しかし、これは私に何も与えていません。DEBUG は確実に True に設定されています。この connection.queries はどのようなコンテキストで保存されますか? つまり、多くの SQL ステートメントを実行する 1 つのページを実行し、作成したhttp://myserver/sqlビューに切り替えて、そこにそれらの SQL ステートメントを表示できるはずですよね? もちろん、同じブラウザセッションを使用して...

db.reset_queries() がコードのどこかで実行されているかどうかを確認しましたが、そうではないようです。

connection.queries が常に空である理由はありますか?

4

5 に答える 5

20

現在のプロセスからのクエリのみが表示されるという Ben の意見は正しいです。同じビュー内またはコンソールで使用できますが、ビュー間では使用できません。

ビューで実行されているクエリを確認する最良の方法は、Django デバッグ ツールバーを使用することです。

于 2010-01-25T17:11:50.270 に答える
9

@Daniel Rosemanは良い考えですが、すぐに使用できるSQLクエリを知りたい場合:

django -command-extensionsをインストールし、インストール済みアプリに追加します。多くの utils コマンドがプロジェクトに追加されます。そのうちの 1 つです。

  • debugsqlshell: Python インタラクティブ シェルでの作業中に実行される SQL を出力します。

例: python manage.py debugsqlshell

In [1]:from django.contrib.auth.models import User
In [1]:User.objects.all()

Out[2]: SELECT "auth_user"."id",
   "auth_user"."username",
   "auth_user"."first_name",
   "auth_user"."last_name",
   "auth_user"."email",
   "auth_user"."password",
   "auth_user"."is_staff",
   "auth_user"."is_active",
   "auth_user"."is_superuser",
   "auth_user"."last_login",
   "auth_user"."date_joined"
    FROM "auth_user" LIMIT 21  [1.25ms]
于 2012-04-23T14:09:34.577 に答える
3

これらのクエリはメモリに保存され、プロセス間で共有されないと思うので、現在のプロセスによって作成されたクエリにのみアクセスできます。

セッションに貼り付けたコードを試してみると、./manage.py shellそのシェル セッションで以前に作成したクエリしか表示されません。

ビューからテンプレート コンテキストに渡しqueriesてテンプレートに表示すると、そのビューで行われたクエリだけが表示されます。ただし、これは開発サーバーを使用しています。

テストはしていませんが、1 つのプロセスで複数のリクエストを処理する環境でこれを使用すると、リクエストごとにより多くのクエリが保存されることがわかります。

于 2010-01-25T16:45:50.873 に答える
2
from django.db import connections
x = connections['rating']
x.queries

So check another connections!
于 2013-02-20T08:01:54.320 に答える
0

それが私にとってそれを修正したものです。私が使用した:

reduce(lambda n, name: n + connections[name].queries, connections, 0)

クエリ数を取得します。

于 2015-05-09T09:04:54.357 に答える