Existe uma maneira de mostrar ao SQL que o Django está executando enquanto executa uma consulta?
307
Consulte a documentação da FAQ: " Como posso ver as consultas SQL brutas que o Django está executando? "
django.db.connection.queries
contém uma lista das consultas SQL:
from django.db import connection
print(connection.queries)
Os conjuntos de consultas também têm um query
atributo que contém a consulta a ser executada:
print(MyModel.objects.filter(name="my name").query)
Observe que a saída da consulta não é SQL válido, porque:
"O Django nunca interpola realmente os parâmetros: envia a consulta e os parâmetros separadamente para o adaptador de banco de dados, que executa as operações apropriadas."
Do relatório de bug do Django # 17741 .
Por isso, você não deve enviar a saída da consulta diretamente para um banco de dados.
str()
função Pythonian incorporada especificada , que chama o__str__()
método interno . Por exemplo,str(MyModel.objects.filter(name="my name").query)
eu também recomendaria o uso do IPython e do shell Django do seu projeto. A conclusão da guia fornece introspecção de objetos. Como o Django é conhecido por seus esquemas de nomeação assertivos, essa metodologia tende a ser muito útil.query
não é SQL válido, porque "o Django nunca interpola realmente os parâmetros: envia a consulta e os parâmetros separadamente para o adaptador de banco de dados, que executa as operações apropriadas." Fonte: code.djangoproject.com/ticket/17741stable
, nãodev
, para link para a versão atual do Django, como este: docs.djangoproject.com/en/stable/faq/models/...O Django-extensions possui um comando shell_plus com um parâmetro
print-sql
No django-shell, todas as consultas executadas serão impressas
Ex.:
fonte
Dê uma olhada em debug_toolbar , é muito útil para depuração.
A documentação e a fonte estão disponíveis em http://django-debug-toolbar.readthedocs.io/ .
fonte
fonte
m = MyModel.objects.get(...)
seguido porm.query
m
não é mais um conjunto de consultas. Useq = MyModel.objects.filter(...)
, entãoq.query
, entãom = q.get()
.Nenhuma outra resposta cobre esse método, portanto:
Acho, de longe, o método mais útil, simples e confiável é perguntar ao seu banco de dados. Por exemplo, no Linux para Postgres, você pode fazer:
Cada banco de dados terá um procedimento ligeiramente diferente. Nos logs do banco de dados, você verá não apenas o SQL bruto, mas qualquer configuração de conexão ou sobrecarga de transação que o django esteja colocando no sistema.
fonte
log_statement='all'
empostgresql.conf
por este método.postgresql.conf
executandopsql -U postgres -c 'SHOW config_file'
Embora você possa fazer isso com o código fornecido, acho que o uso do aplicativo da barra de ferramentas de depuração é uma ótima ferramenta para mostrar consultas. Você pode baixá-lo no github aqui .
Isso oferece a opção de mostrar todas as consultas executadas em uma determinada página, juntamente com o tempo necessário para a consulta. Também resume o número de consultas em uma página e o tempo total para uma revisão rápida. Esta é uma ótima ferramenta, quando você deseja ver o que o Django ORM faz nos bastidores. Ele também possui muitos outros recursos interessantes que você pode usar se quiser.
fonte
Outra opção, consulte as opções de log em settings.py descritas nesta postagem
http://dabapps.com/blog/logging-sql-queries-django-13/
debug_toolbar diminui a velocidade de cada carregamento de página no servidor de desenvolvimento, o registro não é mais rápido. As saídas podem ser despejadas no console ou arquivo, para que a interface do usuário não seja tão boa. Porém, para visualizações com muitos SQLs, pode demorar muito tempo para depurar e otimizar os SQLs através do debug_toolbar, pois o carregamento de cada página é muito lento.
fonte
Se você se certificar de que seu arquivo settings.py possui:
django.core.context_processors.debug
listados emCONTEXT_PROCESSORS
DEBUG=True
IP
naINTERNAL_IPS
tuplaEntão você deve ter acesso à
sql_queries
variável. Anexo um rodapé a cada página que se parece com isso:Eu peguei a variável
sql_time_sum
adicionando a linhapara a função de depuração em django_src / django / core / context_processors.py.
fonte
Desenvolvi uma extensão para esse fim, para que você possa colocar facilmente um decorador na sua função de visualização e ver quantas consultas são executadas.
Para instalar:
Para usar como gerenciador de contexto:
Para usar como decorador:
Github: https://github.com/rabbit-aaron/django-print-sql
fonte
Acredito que isso funcione se você estiver usando o PostgreSQL:
fonte
A seguir, a consulta retorna como SQL válido, com base em https://code.djangoproject.com/ticket/17741 :
fonte
Fiz um pequeno trecho que você pode usar:
Ele assume como função de parâmetros (contém consultas sql) para inspecionar e args, kwargs necessários para chamar essa função. Como resultado, ele retorna qual função retorna e imprime consultas SQL em um console.
fonte
Coloquei essa função em um arquivo util em um dos aplicativos do meu projeto:
Então, quando necessário, basta importá-lo e chamá-lo de qualquer contexto (geralmente uma visualização) que seja necessário, por exemplo:
É bom fazer isso fora do modelo, porque, se você tiver visualizações de API (geralmente o Django Rest Framework), é aplicável também.
fonte
Para o Django 2.2:
Como a maioria das respostas não me ajudou muito ao usar
./manage.py shell
. Finalmente eu encontrei a resposta. Espero que isso ajude alguém.Para visualizar todas as consultas:
Para visualizar a consulta para uma única consulta:
q.query
apenas exibindo o objeto para mim. O uso da__str__()
(representação de String) exibiu a consulta completa.fonte
Exibir consultas usando django.db.connection.queries
Acessar consulta SQL bruta no objeto QuerySet
fonte
Apenas para adicionar, no django, se você tiver uma consulta como:
Faz:
para obter a string sql
fonte