Nplusone是一個用於檢測Python Orms中N+1查詢問題的庫,包括Sqlalchemy,Peewee和Django Orm。
許多對象關聯的映射(ORM)庫默認為懶惰加載關係。當相關行很少訪問時,這種模式可能是有效的,但是隨著關係的頻繁訪問,很快就會效率低下。在這些情況下,使用JOIN
熱量加載相關行可以更具性能。不幸的是,了解何時使用懶惰與急切的加載可能具有挑戰性:您可能不會注意到該應用程序放慢爬網之前。
nplusone
是一種ORM分析工具,可幫助診斷和改善由於不適當的懶惰加載而導致的性能差。 nplusone
使用Django或Sqlalchemy監視應用程序,並在發出可能昂貴的懶惰負載時發送通知。它可以識別問題背後的有問題的關係屬性和特定代碼行,並建議修復以提高性能。
nplusone
還檢測到燒瓶 - 塞拉爾奇米和django orm的不適當急切加載,在急切地加載相關數據時發出警告,但在當前請求中從未訪問。
PIP安裝-u nplusone
nplusone支持python> = 2.7或> = 3.3。
注意: nplusone
僅應用於開發,不應將其部署到生產環境中。
注意: nplusone
支持django> = 1.8。
將nplusone
添加到INSTALLED_APPS
:
intasted_apps =(( ... 'nplusone.ext.django', )
添加NPlusOneMiddleware
:
中間件=(( 'nplusone.ext.django.nplusonemiddleware', ... )
可選地配置記錄設置:
nplusone_logger = logging.getLogger('nplusone') nplusone_log_level = logging.warn
配置記錄處理程序:
記錄= { “版本”:1, “處理者”:{ '安慰': { 'class':'logging.streamhandler', },, },, 'Loggers':{ 'nplusone':{ “處理者”:['Console'],, “級別”:“警告”, },, },, }
當您的應用懶洋洋地加載數據時, nplusone
會發出日誌消息:
潛在的n+1查詢在“ <型號>”上檢測到
考慮在這種情況下使用select_reced或prefetch_reced。
當您的應用急切地加載相關數據而無需訪問數據時, nplusone
將記錄警告:
在“ <model>”上檢測到的潛在不必要的急切負載。
用NPlusOne
包裝應用:
從燒瓶進口燒瓶 來自nplusone.ext.flask_sqlalchemy導入nplusone app =燒瓶(__名稱__) nplusone(app)
可選地配置記錄設置:
app =燒瓶(__名稱__) app.config ['nplusone_logger'] = loggging.getLogger('app.nplusone') app.config ['nplusone_log_level'] = logging.error nplusone(app)
當您的應用懶洋洋地加載數據時, nplusone
會發出日誌消息:
潛在的n+1查詢在“ <型號>”上檢測到
考慮在這種情況下使用subqueryload
或joinedload
;有關完整文檔,請參見SQLalchemy的關係加載指南。
當您的應用急切地加載相關數據而無需訪問數據時, nplusone
將記錄警告:
在“ <model>”上檢測到的潛在不必要的急切負載。
對於遵循WSGI規範的其他框架,請將您的應用程序與nplusonemiddleware一起包裝。您還必須為ORM導入相關的nplusone
擴展名:
進口瓶 來自nplusone.ext.wsgi導入nplusonemiddleware 導入nplusone.ext.sqlalchemy app = nplusonemiddleware(bott.app())
The integrations above are coupled to the request-response cycle.要在HTTP請求的上下文之外使用nplusone
,請使用Profiler
Context Manager:您還必須為ORM導入相關的nplusone
擴展名:
來自nplusone.core Import Profiler 導入nplusone.ext.sqlalchemy 使用Profiler.profiler(): ...
默認情況下, nplusone
使用名為“ Nplusone”的記錄器來記錄所有可能不必要的查詢。當設置NPLUSONE_RAISE配置選項時, nplusone
還將提出NPlusOneError
。這可用於強制所有涉及不必要查詢失敗的自動測試。
#Django配置 nplusone_raise = true #燒瓶配置 app.config ['nplusone_raise'] = true
如果需要,也可以使用NPLUSONE_ERROR
選項指定異常類型。
要忽略全球nplusone
的通知,請使用nplusone_whitelist選項配置白名單:
#Django配置 nplusone_whitelist = [ {'label':'n_plus_one','模型':'myapp.mymodel'} 這是給出的 #Blask-Sqlalchemy配置 app.config ['nplusone_whitelist'] = [ {'label':'unused_eager_load','model':'mymodel','field':'my_field'} 這是給出的
您可以按確切名稱或fnMatch模式進行白名單模型:
#Django配置 nplusone_whitelist = [ {'模型':'myApp。*'} 這是給出的
要在本地抑制通知,請使用ignore
上下文管理器:
來自nplusone.core進口信號 使用Signals.ignore(Signals.lazy_load): #懶惰行 #...
麻省理工學院許可。有關更多詳細信息,請參見捆綁的許可證文件。