queryset - objects.filter django
Django: muestra/registra llamadas ORM sql desde el shell python (7)
Estaba intentando usar " Django: mostrar / registrar llamadas ORM sql desde el shell de Python " en un shell en un servidor de producción, y no funcionaba. Finalmente, alguien señaló que solo hará este registro de depuración cuando DEBUG = True
. Pero puedes solucionarlo así:
import logging
from django.db import connection
connection.force_debug_cursor = True # Change to use_debug_cursor in django < 1.8
l = logging.getLogger(''django.db.backends'')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
Dejo esto aquí para poder encontrarlo más tarde, y espero que le ahorre a alguien la misma excavación que hice.
Usando el excelente Django-Devserver estoy encontrando todo tipo de llamadas SQL interesantes e inesperadas en mi código. Quería encontrar de dónde venían las llamadas, así que estoy buscando una manera de obtener un registro o una impresión de todas las llamadas SQL generadas por el ORM de Django en el shell de Python. Es decir, cuando realizo una llamada a Django ORM a través del shell de Python, me gustaría ver el SQL resultante impreso o registrado.
Noté varias soluciones que agregan información de registro a la página html. ¿Hay una forma fácil de volcar a la línea de comando?
La barra de herramientas Dyango Debug de Rob Hudson, así como su asombro general, también incluye un comando bastante ingenioso debugsqlshell
manage.py que hace exactamente esto.
Si está en el shell, o en cualquier otro lugar, puede usar el método queryset
query.as_sql()
para imprimir el comando SQL.
es decir:
MyModel.objects.all().query.as_sql()
Si estás usando Django 1.3:
import logging
l = logging.getLogger(''django.db.backends'')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
Si realmente quieres ver / registrar todas las consultas SQL, querrás probar Django 1.3 (actualmente en alpha, pero pronto será producción) que habilita los registradores de Python para muchos componentes, incluidos los back-ends de la base de datos.
Por supuesto, si está atrapado usando una versión estable de Django, puede obtener el mismo efecto de manera relativamente fácil parcheando django/db/models/sql/compiler.py
agregando esto al final de la lista de importación:
import logging
_querylogger = logging.getLogger( ''sql.compiler'' )
Encuentra el SQLCompiler::execute_sql()
y cambia:
cursor = self.connection.cursor()
cursor.execute( sql, params )
a esto:
cursor = self.connection.cursor()
_querylogger.info( "%s <= %s", sql, params )
cursor.execute( sql, params )
Use extensiones django.
pip install django-extensions
./manage.py shell_plus --print-sql
Para entornos de producción, es posible que no funcione debido a la configuración de depuración.
qs = YourModel.objects.all()
qs.query.get_compiler(''default'').as_sql()