2012-10-31 7 views
6

一つはdjangoどのようにテストを実行するSQLクエリを参照するには?私のDjangoアプリケーションのユニットテストの

DatabaseError: ORA-00942: table or view does not exist 

と私は、このエラーの原因となった実際のSQLクエリを見たいのですが失敗しました。あなたはそれを達成する方法を知っていますか?

+0

これは役に立ちますか? http://stackoverflow.com/questions/1074212/show-the-sql-django-is-running – Darek

+0

正確ではありません。テストケースに 'print connection.queries'を含めたくないのは、その行を実行するために、まず例外をキャッチする必要があるからです。私がその例外を捕まえると、テストは合格しません。この例外を再発させることはあまりエレガントではありません。私はもっと良い解決策を探しています。 – mnowotka

+0

もう1つのことは、テストでは「プリント」が動作しないことです。少なくとも私にとっては... – mnowotka

答えて

2

私が今までに見つけた最良の解決策は、django-debugtoolbarが提供するdebugsqlshellカスタムdjango管理コマンドです。

12

あなたは/印刷テストからすべて SQLクエリをログに記録し、このようなTestCaseをサブクラス化しようとする場合:

from django.conf import settings 
from django.template import Template, Context 
import sys 
from django.db import connection 
from django.test import TestCase 

class LoggingTestCase(TestCase): 

    @staticmethod 
    def setUpClass(): 
    # The test runner sets DEBUG to False. Set to True to enable SQL logging. 
    settings.DEBUG = True 
    super(LoggingTestCase, LoggingTestCase).setUpClass() 

    @staticmethod 
    def tearDownClass(): 
    super(LoggingTestCase, LoggingTestCase).tearDownClass() 

    time = sum([float(q['time']) for q in connection.queries]) 
    t = Template("{{count}} quer{{count|pluralize:\"y,ies\"}} in {{time}} seconds:\n\n{% for sql in sqllog %}[{{forloop.counter}}] {{sql.time}}s: {{sql.sql|safe}}{% if not forloop.last %}\n\n{% endif %}{% endfor %}") 
    print >> sys.stderr, t.render(Context({'sqllog': connection.queries, 'count': len(connection.queries), 'time': time})) 

    # Empty the query list between TestCases.  
    connection.queries = [] 

次に、あなたのテストで基本クラスとしてLoggingTestCaseの代わりTestCaseを使用しています。これを無効にする場合は、tearDownClassと覚えておいてください。

+0

を参照してください。スーパーsetUpClassも呼び出す必要があります。そうしないと、フィクスチャーの読み込みなどが行方不明になります。 – arsenbonbon

+0

@アーセンボンボン良い点、今修正されました。 downvotedの場合は、un-downvotingを検討してください。http:// stackoverflowを参照してください。com/help/privileges/vote-down – tuomassalo

+0

Djangoは実際にすべてのクエリを出力するためにいくつかの環境変数を設定することを許可していませんか? – Andy

2

これは最もクリーンな解決策ではありませんが、追加のパッケージをインストールせずにすぐにデバッグしたい場合は、django/dbのexecute()メソッドを探すことができます。

ジャンゴ/ DB /バックエンド/オラクル/ base.pyと探し:Oracleのについて

は、私はそれがである推測

:PostgreSQLの

def execute 

のためにそれがです

django/db/backends/postgresql_psycopg2/base.py

CursorWrapperにはexecute()メソッド

どちらもIntegrityErrorとDatabaseErrorを受け取りました。そこにprintステートメントを追加できます。

すべてのSQLクエリを表示するpplの場合は、関数呼び出しの直後にprintステートメントを挿入します。

0

設定でコンソールレベルをDEBUGに変更できます。 Django 1.9で動作しました。

LOGGING = { 
... 
'handlers': { 
    'console': { 
     'level': 'DEBUG', 
     'class': 'logging.StreamHandler', 
     'formatter': 'simple' 
     }, 
    } 
... 
} 
関連する問題