Nplusone - это библиотека для обнаружения проблемы запросов N+1 в Python Orms, включая Sqlalchemy, Peewee и Django Orm.
Многие библиотеки картирования объектно-релационного (ORM) по умолчанию по умолчанию для ленивой загрузки для отношений. Этот шаблон может быть эффективным, когда связанные строки редко обращаются, но быстро становится неэффективным, поскольку отношения обращаются чаще. В этих случаях загрузка связанных строк с использованием JOIN
может быть гораздо более эффективной. К сожалению, понимание того, когда использовать ленивую и нетерпеливую нагрузку, может быть сложным: вы можете не заметить проблему, пока ваше приложение не замедлится до ползания.
nplusone
- это инструмент профилирования ORM, который помогает диагностировать и повысить плохую производительность, вызванную неуместной ленивой нагрузкой. nplusone
контролирует приложения с использованием Django или SQLalchemy и посылает уведомления, когда испускаются потенциально дорогие ленивые нагрузки. Он может идентифицировать атрибут отношений нарушений и конкретные строки кода за проблемой и рекомендовать исправления для лучшей производительности.
nplusone
также обнаруживает неуместную нетерпеливую нагрузку для Flask-Sqlalchemy и Django Orm, издавая предупреждение, когда связанные данные с нетерпением загружаются, но никогда не доступны в рамках текущего запроса.
PIP установка -U NPLUSONE
Nplusone поддерживает Python> = 2,7 или> = 3,3.
Примечание. nplusone
должен использоваться только для разработки и не должен быть развернут в производственных средах.
Примечание. nplusone
поддерживает Django> = 1,8.
Добавить nplusone
в INSTALLED_APPS
:
Stasted_apps = ( ... 'nplusone.ext.django', )
Добавить NPlusOneMiddleware
:
Промежуточное программное обеспечение = ( 'nplusone.ext.django.nplusonemiddleware', ... )
Необязательно настроить настройки журнала:
Nplusone_logger = logging.getlogger ('nplusone') Nplusone_log_level = logging.warn
Настройте обработчики ведения журнала:
Logging = { 'версия': 1, 'обработчики': { 'Консоль': { 'class': 'logging.streamhandler', }, }, 'Loggers': { 'nplusone': { 'Хандлеры': ['Консоль'], 'level': 'предупреждать', }, }, }
Когда ваше приложение лениво загружает данные, nplusone
испускает сообщение журнала:
Потенциальный запрос n+1, обнаруженный на `<delore>. <field>`
Рассмотрите возможность использования select_related или prefetch_related в этом случае.
Когда ваше приложение с нетерпением загружает связанные данные без доступа к нему, nplusone
будет регистрировать предупреждение:
Потенциальная ненужная нежелательная нагрузка, обнаруженная на `<DOMEL>. <Field>`
Приложение обертки с NPlusOne
:
из колбы из колбы импорт от nplusone.ext.flask_sqlalchemy import nplusone app = колба (__ name__) Nplusone (приложение)
Необязательно настроить настройки журнала:
app = колба (__ name__) app.config ['nplusone_logger'] = logging.getlogger ('app.nplusone') app.config ['nplusone_log_level'] = logging.error Nplusone (приложение)
Когда ваше приложение лениво загружает данные, nplusone
испускает сообщение журнала:
Потенциальный запрос n+1, обнаруженный на `<delore>. <field>`
Рассмотрите возможность использования subqueryload
или joinedload
в этом случае; См. Руководство SQLALCHEMY по загрузке отношений для полной документации.
Когда ваше приложение с нетерпением загружает связанные данные без доступа к нему, nplusone
будет регистрировать предупреждение:
Потенциальная ненужная нежелательная нагрузка, обнаруженная на `<DOMEL>. <Field>`
Для других структур, которые следуют спецификации WSGI, оберните свое приложение NplusOnemiddleware. Вы также должны импортировать соответствующее расширение nplusone
для вашего ORM:
импортная бутылка от nplusone.ext.wsgi import nplusonemiddleware Импорт nplusone.ext.sqlalchemy app = nplusonemiddleware (bottle.app ())
Интеграции выше связаны с циклом запроса ответа. Чтобы использовать nplusone
вне контекста HTTP -запроса, используйте Profiler
Context Manager: вы также должны импортировать соответствующее расширение nplusone
для вашего ORM:
от nplusone.core import profiler Импорт nplusone.ext.sqlalchemy с profiler.profiler (): ...
По умолчанию nplusone
регистрирует все потенциально ненужные запросы, используя журнал с именем «Nplusone». Когда будет установлен опция конфигурации nplusone_raise, nplusone
также поднимет NPlusOneError
. Это может быть использовано, чтобы заставить все автоматизированные тесты, включающие ненужные запросы провалиться.
# Django config Nplusone_raise = true # Clask Config app.config ['nplusone_raise'] = true
Тип исключения также может быть указан, при желании, используя опцию NPLUSONE_ERROR
.
Чтобы игнорировать уведомления из nplusone
во всем мире, настройте белого списка, используя опцию nplusone_whitelist:
# Django config Nplusone_whitelist = [ {'label': 'n_plus_one', 'model': 'myapp.mymodel'} ] # Flask-Sqlalchemy Config app.config ['nplusone_whitelist'] = [ {'label': 'Unuse_eager_load', 'model': 'mymodel', 'field': 'my_field'} ]
Вы можете модели белого списка с точным именем или по шаблонам fnmatch:
# Django config Nplusone_whitelist = [ {'model': 'myApp.*'} ]
Чтобы подавить уведомления локально, используйте диспетчер ignore
контекст:
от nplusone.core import signals с signals.ignore (signals.lazy_load): # Ленивые ряды # ...
MIT лицензирован. Смотрите в комплекте лицензии в комплекте.