一つはdjangoどのようにテストを実行するSQLクエリを参照するには?私のDjangoアプリケーションのユニットテストの
DatabaseError: ORA-00942: table or view does not exist
と私は、このエラーの原因となった実際のSQLクエリを見たいのですが失敗しました。あなたはそれを達成する方法を知っていますか?
一つはdjangoどのようにテストを実行するSQLクエリを参照するには?私のDjangoアプリケーションのユニットテストの
DatabaseError: ORA-00942: table or view does not exist
と私は、このエラーの原因となった実際のSQLクエリを見たいのですが失敗しました。あなたはそれを達成する方法を知っていますか?
私が今までに見つけた最良の解決策は、django-debugtoolbarが提供するdebugsqlshellカスタムdjango管理コマンドです。
あなたは/印刷テストからすべて 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
と覚えておいてください。
を参照してください。スーパーsetUpClassも呼び出す必要があります。そうしないと、フィクスチャーの読み込みなどが行方不明になります。 – arsenbonbon
@アーセンボンボン良い点、今修正されました。 downvotedの場合は、un-downvotingを検討してください。http:// stackoverflowを参照してください。com/help/privileges/vote-down – tuomassalo
Djangoは実際にすべてのクエリを出力するためにいくつかの環境変数を設定することを許可していませんか? – Andy
これは最もクリーンな解決策ではありませんが、追加のパッケージをインストールせずにすぐにデバッグしたい場合は、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ステートメントを挿入します。
設定でコンソールレベルをDEBUGに変更できます。 Django 1.9で動作しました。
LOGGING = {
...
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
}
...
}
これは役に立ちますか? http://stackoverflow.com/questions/1074212/show-the-sql-django-is-running – Darek
正確ではありません。テストケースに 'print connection.queries'を含めたくないのは、その行を実行するために、まず例外をキャッチする必要があるからです。私がその例外を捕まえると、テストは合格しません。この例外を再発させることはあまりエレガントではありません。私はもっと良い解決策を探しています。 – mnowotka
もう1つのことは、テストでは「プリント」が動作しないことです。少なくとも私にとっては... – mnowotka