Nplusone es una biblioteca para detectar el problema de consultas N+1 en Python Orms, incluidas Sqlalchemy, Peewee y el Django Orm.
Muchas bibliotecas de mapeo de objetos relacionales (ORM) predeterminados a la carga perezosa para las relaciones. Este patrón puede ser eficiente cuando rara vez se accede a filas relacionadas, pero rápidamente se vuelve ineficiente a medida que se accede a las relaciones con mayor frecuencia. En estos casos, la carga de filas relacionadas con ansiedad utilizando una JOIN
puede ser mucho más desempeñada. Desafortunadamente, comprender cuándo usar la carga perezosa versus ansiosa puede ser un desafío: es posible que no note el problema hasta que su aplicación se haya ralentizado.
nplusone
es una herramienta de perfil ORM para ayudar a diagnosticar y mejorar el bajo rendimiento causado por una carga perezosa inapropiada. nplusone
monitorea aplicaciones que utilizan Django o Sqlalchemy y envían notificaciones cuando se emiten cargas perezosas potencialmente caras. Puede identificar el atributo de relación ofensiva y las líneas de código específicas detrás del problema, y recomendar correcciones para un mejor rendimiento.
nplusone
también detecta una carga ansiosa inapropiada para Flask-Sqlalchemy y el Django Orm, emitiendo una advertencia cuando los datos relacionados se cargan ansiosamente pero nunca se acceden dentro de la solicitud actual.
PIP install -u nplusone
Nplusone admite Python> = 2.7 o> = 3.3.
Nota: nplusone
solo debe usarse para el desarrollo y no debe implementarse en entornos de producción.
Nota: nplusone
admite Django> = 1.8.
Agregue nplusone
a INSTALLED_APPS
:
Instalado_apps = ( ... 'nplusone.ext.django', )
Agregar NPlusOneMiddleware
:
Middleware = ( 'nplusone.ext.django.nplusonemiddleware', ... )
Opcionalmente, configure la configuración de registro:
Nplusone_logger = logging.getlogger ('nplusone') Nplusone_log_level = logging.warn
Configurar controladores de registro:
Logging = { 'Versión': 1, 'manejadores': { 'Consola': { 'class': 'logging.streamhandler', }, }, 'Loggers': { 'nplusone': { 'manejadores': ['consola'], 'nivel': 'advertir', }, }, }
Cuando su aplicación carga datos perezosamente, nplusone
emitirá un mensaje de registro:
Consulta N+1 potencial detectada en `<model>. <field>`
Considere usar select_related o prefetch_related en este caso.
Cuando su aplicación carga con entusiasmo los datos relacionados sin acceder a él, nplusone
registrará una advertencia:
Potencial de carga ansiosa innecesaria detectada en `<model>. <field>`
Envolver la aplicación con NPlusOne
:
de Flask Import Flask de nplusone.ext.flask_sqlalchemy import nplusone App = Flask (__ Nombre__) Nplusone (aplicación)
Opcionalmente, configure la configuración de registro:
App = Flask (__ Nombre__) app.config ['nplusone_logger'] = logging.getlogger ('app.nplusone') app.config ['nplusone_log_level'] = logging.error Nplusone (aplicación)
Cuando su aplicación carga datos perezosamente, nplusone
emitirá un mensaje de registro:
Consulta N+1 potencial detectada en `<model>. <field>`
Considere usar subqueryload
o joinedload
en este caso; Consulte la Guía de Sqlalchemy para la carga de relaciones para la documentación completa.
Cuando su aplicación carga con entusiasmo los datos relacionados sin acceder a él, nplusone
registrará una advertencia:
Potencial de carga ansiosa innecesaria detectada en `<model>. <field>`
Para otros marcos que siguen la especificación WSGI, envuelva su aplicación con NplusonemIDdleware. También debe importar la extensión nplusone
correspondiente para su ORM:
botella de importación de nplusone.ext.wsgi import nplusonemiddleware import nplusone.ext.sqlalchemy app = nplusonemiddleware (botella.app ())
Las integraciones anteriores están acopladas al ciclo de solicitud de solicitud. Para usar nplusone
fuera del contexto de una solicitud HTTP, use el administrador de contexto Profiler
: también debe importar la extensión nplusone
correspondiente para su ORM:
de nplusone.core importación de importación import nplusone.ext.sqlalchemy con Profiler.Profiler (): ...
De forma predeterminada, nplusone
registra todas las consultas potencialmente innecesarias utilizando un registrador llamado "Nplusone". Cuando se establece la opción de configuración NPLUSOne_Raise, nplusone
también elevará un NPlusOneError
. Esto se puede utilizar para forzar todas las pruebas automatizadas que involucran consultas innecesarias para fallar.
# Configuración django Nplusone_raise = verdadero # Configuración de frascos app.config ['nplusone_raise'] = true
El tipo de excepción también se puede especificar, si lo desea, utilizando la opción NPLUSONE_ERROR
.
Para ignorar las notificaciones de nplusone
a nivel mundial, configure la lista blanca utilizando la opción NPLUSOne_WhitElist:
# Configuración django Nplusone_whitelist = [ {'etiqueta': 'n_plus_one', 'modelo': 'myapp.mymodel'} ] # Flask-Sqlalchemy Config app.config ['nplusone_whitelist'] = [ {'etiqueta': 'no usado_eager_load', 'modelo': 'mymodel', 'campo': 'my_field} ]
Puede Whitelist Models por nombre exacto o por patrones de fnmatch:
# Configuración django Nplusone_whitelist = [ {'modelo': 'myapp.*'} ]
Para suprimir las notificaciones localmente, use el gerente de contexto ignore
:
de nplusone.core señales de importación con señales.ignore (señales.lazy_load): # filas de carga lento # ...
MIT con licencia. Consulte el archivo de licencia agrupada para obtener más detalles.