Nplusone est une bibliothèque pour détecter le problème des requêtes N + 1 dans Python ORMS, y compris Sqlalchemy, Peewee et Django Orm.
De nombreuses bibliothèques de mappage d'objet-relation (ORM) par défaut sont par défaut du chargement paresseux pour les relations. Ce modèle peut être efficace lorsque les lignes apparentées sont rarement accessibles, mais devient rapidement inefficace car les relations sont accessibles plus fréquemment. Dans ces cas, le chargement des lignes associées à l'aide d'une JOIN
peut être beaucoup plus performante. Malheureusement, comprendre quand utiliser le chargement paresseux versus impatient peut être difficile: vous pourriez ne pas remarquer le problème tant que votre application a ralenti en rampant.
nplusone
est un outil de profilage ORM pour aider à diagnostiquer et à améliorer les mauvaises performances causées par un chargement paresseux inapproprié. nplusone
surveille les applications utilisant Django ou Sqlalchemy et envoie des notifications lorsque des charges paresseuses potentiellement coûteuses sont émises. Il peut identifier l'attribut de relation incriminée et les lignes de code spécifiques derrière le problème et recommander des correctifs pour de meilleures performances.
nplusone
détecte également le chargement désireux inapproprié pour Flask-Sqlalchemy et le Django Orm, émettant un avertissement lorsque les données connexes sont chargées avec impatience mais jamais accessibles dans la demande actuelle.
pip install -u nplusone
NplusOne prend en charge Python> = 2,7 ou> = 3,3.
Remarque: nplusone
ne doit être utilisé que pour le développement et ne doit pas être déployé dans des environnements de production.
Remarque: nplusone
prend en charge Django> = 1,8.
Ajouter nplusone
à INSTALLED_APPS
:
Installé_apps = ( ... 'nplusone.ext.django', )
Ajouter NPlusOneMiddleware
:
Middleware = ( 'nplusone.ext.django.nplusonemiddleware', ... )
Configurer éventuellement les paramètres de journalisation:
Nplusone_logger = logging.getLogger ('nplusone') Nplusone_log_level = logging.warn
Configurer les gestionnaires de journalisation:
Logging = { 'Version': 1, 'Handlers': { 'Console': { «Classe»: «logging.streamhandler», }, }, 'Loggers': { 'nplusone': { 'Handlers': ['Console'], «Niveau»: «avertir», }, }, }
Lorsque votre application charge les données paresseusement, nplusone
émettra un message de journal:
Potentiel n + 1 requête détectée sur `<model>. <Field>`
Envisagez d'utiliser select_related ou prefetch_related dans ce cas.
Lorsque votre application charge avec impatience des données connexes sans y accéder, nplusone
enregistrera un avertissement:
Potentiel inutile Charge avide détectée sur `<model>. <Field>`
Application enveloppante avec NPlusOne
:
De Flask Import Flask à partir de nplusone.ext.flask_sqlalchemy import nplusone app = flacon (__ name__) Nplusone (app)
Configurer éventuellement les paramètres de journalisation:
app = flacon (__ name__) app.config ['nplusone_logger'] = logging.getLogger ('app.nplusone') app.config ['nplusone_log_level'] = logging.error Nplusone (app)
Lorsque votre application charge les données paresseusement, nplusone
émettra un message de journal:
Potentiel n + 1 requête détectée sur `<model>. <Field>`
Envisagez d'utiliser subqueryload
ou joinedload
dans ce cas; Voir Guide de Sqlalchemy pour le chargement des relations pour la documentation complète.
Lorsque votre application charge avec impatience des données connexes sans y accéder, nplusone
enregistrera un avertissement:
Potentiel inutile Charge avide détectée sur `<model>. <Field>`
Pour d'autres cadres qui suivent la spécification WSGI, enveloppez votre application avec NplusonEmiddleware. Vous devez également importer l'extension nplusone
pertinente pour votre ORM:
bouteille d'importation à partir de nplusone.ext.wsgi import nplusonemiddleware importer nplusone.ext.sqlalchemy app = nplusonemiddleware (Bottle.App ())
Les intégrations ci-dessus sont couplées au cycle de demande-réponse. Pour utiliser nplusone
en dehors du contexte d'une demande HTTP, utilisez le gestionnaire de contexte Profiler
: vous devez également importer l'extension nplusone
pertinente pour votre ORM:
à partir de Nplusone.Core Import Profiler importer nplusone.ext.sqlalchemy avec Profiler.Profiler (): ...
Par défaut, nplusone
enregistre toutes les requêtes potentiellement inutiles à l'aide d'un enregistreur nommé "nplusone". Lorsque l'option de configuration NplusOne_RAISE est définie, nplusone
soulèvera également un NPlusOneError
. Cela peut être utilisé pour forcer tous les tests automatisés impliquant des requêtes inutiles à échouer.
# Configo configo Nplusone_raise = true # Config app.config ['nplusone_raise'] = true
Le type d'exception peut également être spécifié, si vous le souhaitez, en utilisant l'option NPLUSONE_ERROR
.
Pour ignorer les notifications de nplusone
dans le monde, configurez la liste blanche à l'aide de l'option NPlusOne_WhiteList:
# Configo configo Nplusone_whiteList = [ {'label': 'n_plus_one', 'modèle': 'myapp.mymodel'} ]] # Flask-Sqlalchemy Config app.config ['nplusone_whitelist'] = [ ? ]]
Vous pouvez les modèles de liste blanche par nom exact ou par motifs fnmatch:
# Configo configo Nplusone_whiteList = [ {'modèle': 'myapp. *'} ]]
Pour supprimer les notifications localement, utilisez le gestionnaire de contexte ignore
:
à partir des signaux d'importation nplusone.core avec signals.ignore (signals.lazy_load): # lignes de chargement paresseuses # ...
MIT sous licence. Voir le fichier de licence groupé pour plus de détails.