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())
上面的集成与请求响应周期耦合。要在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): #懒惰行 #...
麻省理工学院许可。有关更多详细信息,请参见捆绑的许可证文件。