NPLUSONE ist eine Bibliothek zum Erkennen des N+1 -Abfragenproblems in Python -Ormen, einschließlich Sqlalchemy, Peewee und dem Django Orm.
Viele Bibliotheken für Objekt-Relationskartierungen (ORM) standardmäßig für Beziehungen für Beziehungen. Dieses Muster kann effizient sein, wenn verwandte Zeilen selten zugegriffen werden, wird jedoch schnell ineffizient, da auf Beziehungen häufiger zugegriffen werden. In diesen Fällen kann das ladenbezogene Zeilen mit einem JOIN
sehr leistungsfähiger sein. Leider kann es eine Herausforderung sein, zu verstehen, wann faul und eifrig geladen werden muss: Das Problem bemerkt möglicherweise erst, wenn sich Ihre App auf ein Crawl verlangsamt hat.
nplusone
ist ein ORM -Profiling -Tool, mit dem die schlechte Leistung diagnostiziert und verbessert wird, die durch unangemessene faule Laden verursacht werden. nplusone
überwacht Anwendungen mit Django oder SQLalchemy und sendet Benachrichtigungen, wenn möglicherweise teure faule Lasten emittiert werden. Es kann das Attribut für beleidigende Beziehungen und bestimmte Codezeilen des Problems identifizieren und Fixes für eine bessere Leistung empfehlen.
nplusone
erkennt auch unangemessene, eifrige Belastung für Flask-SQLAlchemy und Django ORM und gibt eine Warnung aus, wenn verwandte Daten eifrig geladen werden, aber in der aktuellen Anfrage nie zugegriffen werden.
PIP Installation -U nplusone
Nplusone unterstützt Python> = 2,7 oder> = 3,3.
Hinweis: nplusone
sollte nur für die Entwicklung verwendet werden und nicht in Produktionsumgebungen eingesetzt werden.
Hinweis: nplusone
unterstützt Django> = 1,8.
Fügen Sie nplusone
zu INSTALLED_APPS
hinzu:
Installed_apps = (( ... 'nplusone.ext.django', )
Fügen Sie NPlusOneMiddleware
hinzu:
Middleware = (( 'nplusone.ext.django.nplusonemiddleware', ... )
Optional konfigurieren Sie Protokollierungseinstellungen:
Nplusone_logger = logging.getLogger ('nplusone') Nplusone_log_level = logging.warn
Konfigurieren von Protokollierungshandlern:
Logging = { 'Version': 1,, 'Handler': {{ 'Konsole': { 'Klasse': 'logging.streamHandler', ' }, }, 'Loggers': {{ 'nplusone': {{ 'Handler': ['Konsole'], 'Level': 'warnen', }, }, }
Wenn Ihre App Daten träge lädt, wird nplusone
eine Protokollnachricht ausgibt:
Potenzielle N+1 -Abfrage, die auf `<modell> <Field>` nachgewiesen wurde
Erwägen Sie in diesem Fall mit select_related oder prefetch_related.
Wenn Ihre App zugeordnete Daten ohne darauf zugänglicher Daten lädt, protokolliert nplusone
eine Warnung:
Potenzielle unnötige eifrige Belastung auf `<model>. <Field>`
Wrap -Anwendung mit NPlusOne
:
aus Flask -Importkolben von nplusone.ext.flask_sqlalchemy import nplusone app = Flask (__ Name__) Nplusone (App)
Optional konfigurieren Sie Protokollierungseinstellungen:
app = Flask (__ Name__) app.config ['nplusone_logger'] = logging.getLogger ('app.nplusone') app.config ['nplusone_log_level'] = logging.Error Nplusone (App)
Wenn Ihre App Daten träge lädt, wird nplusone
eine Protokollnachricht ausgibt:
Potenzielle N+1 -Abfrage, die auf `<modell> <Field>` nachgewiesen wurde
Erwägen Sie in diesem Fall die Verwendung subqueryload
oder joinedload
. In SQLALCHEMYS Leitfaden zum Laden von Beziehungen finden Sie eine vollständige Dokumentation.
Wenn Ihre App zugeordnete Daten ohne darauf zugänglicher Daten lädt, protokolliert nplusone
eine Warnung:
Potenzielle unnötige eifrige Belastung auf `<model>. <Field>`
Wickeln Sie für andere Frameworks, die der WSGI -Spezifikation folgen, Ihre Anwendung mit Nplusonemiddleware ein. Sie müssen auch die entsprechende nplusone
-Erweiterung für Ihr ORM importieren:
Flasche importieren von nplusone.ext.wsgi import nplusonemiddleware importieren nplusone.ext.sqlalchemy app = nplusonemiddleware (bottle.app ())
Die obigen Integrationen sind mit dem Anforderungsreaktionszyklus verbunden. Verwenden Sie den Profiler
Context Manager, um nplusone
außerhalb des Kontextes einer HTTP -Anforderung zu verwenden: Sie müssen auch die entsprechende nplusone
-Erweiterung für Ihr ORM importieren:
von nplusone.core Importprofiler importieren nplusone.ext.sqlalchemy mit Profiler.profiler (): ...
Standardmäßig protokolliert nplusone
alle potenziell unnötigen Abfragen mit einem Logger mit dem Namen "Nplusone". Wenn die Konfigurationsoption nplusone_raise festgelegt ist, erhöht nplusone
auch einen NPlusOneError
. Dies kann verwendet werden, um alle automatisierten Tests zu erzwingen, die unnötige Abfragen zum Ausfall bringen.
# Django config Nplusone_raise = true # Flask -Konfiguration app.config ['nplusone_raise'] = true
Der Ausnahmetyp kann auch unter Verwendung der Option NPLUSONE_ERROR
auch, falls gewünscht, angegeben werden.
So konfigurieren Sie den Whitelist mit der Option nplusone_whitelist, um Benachrichtigungen von nplusone
global zu ignorieren:
# Django config NPLUSONE_WHITELIST = [ {'Label': 'n_plus_one', 'modell': 'myapp.mymodel'} ] # Flask-Sqlalchemy-Konfiguration app.config ['nplusone_whitelist'] = [ {'Label': 'UNUBUTE_EAGER_LOAD', 'Modell': 'MyModel', 'Feld': 'my_field'} ]
Sie können Whitelist -Modelle mit genauem Namen oder mit FNMatch -Mustern:
# Django config NPLUSONE_WHITELIST = [ {'Modell': 'MyApp.*'} ]
Um Benachrichtigungen lokal zu unterdrücken, verwenden Sie den Kontextmanager ignore
:
von nplusone.core -Importsignalen mit signalen.ignore (signals.lazy_load): # Fauzladerreihen # ...
MIT lizenziert. Weitere Informationen finden Sie in der gebündelten Lizenzdatei.