trigger - Desactivar el registro de SQL mientras se mantiene la configuración
registro de transacciones contabilidad (4)
Cuando settings.DEBUG es True, Django usa CursorDebugWrapper en lugar de CursorWrapper. Esto es lo que agrega las consultas a connection.queries y consume memoria. Me gustaría aplicar un parche a la envoltura de conexión para usar siempre CursorWrapper:
from django.conf import settings
from django.db.backends import BaseDatabaseWrapper
from django.db.backends.util import CursorWrapper
if settings.DEBUG:
BaseDatabaseWrapper.make_debug_cursor = lambda self, cursor: CursorWrapper(cursor, self)
Deshabilitar el registro como otros sugieren no solucionará el problema, ya que CursorDebugWrapper aún almacena las consultas en connection.queries incluso si el registro está desactivado.
Django registra las operaciones de SQL en un búfer interno (ya sea que se registre en un archivo o no) cuando settings.DEBUG = True. Debido a que tengo un proceso de larga ejecución que realiza muchas operaciones de base de datos, esto hace que mis instancias en modo de desarrollo del programa crezcan en el consumo de memoria muy rápidamente.
Me gustaría deshabilitar el mecanismo de registro de SQL interno y dejar la configuración de.DEBUG activada para mi desarrollo: ¿es esto posible?
Django versión 1.3.0.
Esto funcionó para mí (al menos para Django 1.3.1):
from django.db import connection
connection.use_debug_cursor = False
Encontré esa variable que inspecciona el código fuente de Django (no está documentado), las líneas relevantes se encuentran en django/db/backends/__init__.py
(clase BaseDatabaseWrapper
):
def cursor(self):
if (self.use_debug_cursor or
(self.use_debug_cursor is None and settings.DEBUG)):
cursor = self.make_debug_cursor(self._cursor())
else:
cursor = util.CursorWrapper(self._cursor(), self)
return cursor
Sí, puede silenciar el inicio de sesión de sql asignando un ''manejador nulo'' al registrador llamado ''django.db.backends''. Supongo que usas la nueva configuración de registro basada en dict de django ? Si es así, este fragmento debería facilitarlo:
...
''handlers'': {
''null'': {
''level'': ''DEBUG'',
''class'':''logging.NullHandler'',
},
...
''loggers'': {
... your regular logger ''root'' or '''' ....
''django.db.backends'': {
''handlers'': [''null''], # Quiet by default!
''propagate'': False,
''level'':''DEBUG'',
},
...
Actualización: mira la respuesta de Brian, también. Entendí que "registro" significa el registro irritante de cada declaración de SQL. Brian habla sobre el registro de memoria interna de cada consulta (y supongo que tiene razón :-)
Si todavía está interesado en rastrear las operaciones de SQL con fines de depuración, también puede limpiar la lista de conexiones.queries periódicamente para reclamar la memoria:
from django.db import connection
for i in range(start, count, size):
objects = MyModel.objects.order_by(''pk'').all()[i:i + size]
...
print connection.queries
connection.queries = []