2012-10-31 18 views
6

Uno dei miei test di unità applicazione Django non riesce condjango come visualizzare la query sql durante l'esecuzione dei test?

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

Mi piacerebbe vedere domanda reale di SQL che ha causato questo errore. Sai come riuscirci?

+0

È utile? http://stackoverflow.com/questions/1074212/show-the-sql-django-is-running – Darek

+0

Non esattamente. Non voglio includere "print connection.queries" nel caso di test perché, per eseguire quella linea, dovrei prima rilevare un'eccezione. Se rilevo questa eccezione, il test passerà quale non è buono. Reraising questa eccezione non è molto elegante, sto cercando una soluzione migliore. – mnowotka

+0

Un'altra cosa è che "stampa" non funziona con i test - almeno per me ... – mnowotka

risposta

2

La soluzione migliore che ho trovato finora è il comando di gestione django personalizzato di debugsqlshell fornito da django-debugtoolbar.

12

Se si desidera stampare/log tutti query SQL dei test, provare sottoclasse TestCase come questo:

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 = [] 

Quindi utilizzare LoggingTestCase invece di TestCase come classe base nei test. Ricordati di chiamare questo tearDownClass se lo sostituisci.

+0

Dovresti chiamare anche super setUpClass. Quando non lo fai, mancano le cose, ad esempio il caricamento delle fixture. – arsenbonbon

+0

@arsenbonbon buon punto, risolto ora. Se hai downvoted, per favore considera un downvoting, vedi: stackoverflow http: //.it/help/privilegi/vote-down – tuomassalo

+0

Django non ti permette davvero di impostare alcune variabili d'ambiente per stampare tutte le query? – Andy

2

Non è la soluzione più pulita ma se si desidera eseguire rapidamente il debug senza installare pacchetti aggiuntivi, è possibile cercare il metodo execute() in django/db.

Per Oracle Credo che sia in:

Django/db/backend/Oracle/base.py e cercare:

def execute 

Per PostgreSQL è in:

django/db/backend/postgresql_psycopg2/base.py

In CursorWrapper c'è un metodo execute().

Entrambi stanno rilevando IntegrityError e DatabaseError, è possibile aggiungere una dichiarazione di stampa lì.

Per ppl che desidera visualizzare tutte le query sql, inserire l'istruzione di stampa subito dopo la chiamata della funzione.

0

È possibile modificare il livello della console in DEBUG nelle impostazioni. Ha funzionato su Django 1.9.

LOGGING = { 
... 
'handlers': { 
    'console': { 
     'level': 'DEBUG', 
     'class': 'logging.StreamHandler', 
     'formatter': 'simple' 
     }, 
    } 
... 
} 
Problemi correlati