NPLUSONE은 SQLALCHEMY, PEEWEE 및 DJANGO ORM을 포함한 Python Orms의 N+1 쿼리 문제를 감지하기위한 라이브러리입니다.
ORM (Object-Relational Mapping) 라이브러리는 관계에 대한 게으른로드에 기본적으로 기본적으로. 관련 행이 거의 액세스되지 않으면이 패턴이 효율적일 수 있지만 관계에 더 자주 액세스 할 때 빠르게 비효율적입니다. 이러한 경우, 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
:
installed_apps = ( ... 'nplusone.ext.django', ))
NPlusOneMiddleware
추가 :
미들웨어 = ( 'nplusone.ext.django.nplusonemiddleware', ... ))
선택적으로 로깅 설정을 구성합니다.
nplusone_logger = logging.getLogger ( 'nplusone') nplusone_log_level = logging.warn
로깅 핸들러 구성 :
로깅 = { '버전': 1, '핸들러': { '콘솔': { '클래스': 'logging.streamhandler', }, }, '로거': { 'nplusone': { '핸들러': [ '콘솔'], '레벨': '경고', }, }, }
앱이 데이터를 게으르게로드하면 nplusone
로그 메시지를 방출합니다.
전위 N+1 쿼리가`<model>. <field>`에서 감지했습니다
이 경우 select_related 또는 prefetch_related를 사용하는 것을 고려하십시오.
앱이 관련 데이터에 액세스하지 않고 열심히로드하면 nplusone
경고를 기록합니다.
`<model>. <field>`에서 감지 된 잠재적 불필요한 열성적인 하중
NPlusOne
로 응용 프로그램을 마무리하십시오.
플라스크 수입 플라스크에서 nplusone.ext.flask_sqlalchemy import nplusone에서 app = flask (__ name__) nplusone (앱)
선택적으로 로깅 설정을 구성합니다.
app = flask (__ name__) app.config [ 'nplusone_logger'] = logging.getLogger ( 'app.nplusone') app.config [ 'nplusone_log_level'] = logging.error nplusone (앱)
앱이 데이터를 게으르게로드하면 nplusone
로그 메시지를 방출합니다.
전위 N+1 쿼리가`<model>. <field>`에서 감지했습니다
이 경우 subqueryload
또는 joinedload
사용을 고려하십시오. 완전한 문서화는 Sqlalchemy의 관계 로딩에 대한 Sqlalchemy의 가이드를 참조하십시오.
앱이 관련 데이터에 액세스하지 않고 열심히로드하면 nplusone
경고를 기록합니다.
`<model>. <field>`에서 감지 된 잠재적 불필요한 열성적인 하중
WSGI 사양을 따르는 다른 프레임 워크의 경우 응용 프로그램을 nplusonemiddleware로 마무리하십시오. 또한 ORM의 관련 nplusone
확장 기능을 가져와야합니다.
수입 병 nplusone.ext.wsgi import에서 nplusonemiddleware nplusone.ext.sqlalchemy를 가져 오십시오 app = nplusonemiddleware (bottle.app ())
위의 통합은 요청-응답주기와 결합됩니다. HTTP 요청의 컨텍스트 외부에서 nplusone
사용하려면 Profiler
Context Manager를 사용하십시오. 또한 ORM의 관련 nplusone
확장 기능을 가져와야합니다.
NPLUSONE. CORE 가져 오기 프로파일 러 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', 'model': 'myapp.mymodel'}} ]] # flask-sqlalchemy config app.config [ 'nplusone_whitelist'] = [ { 'label': 'unused_eager_load', 'model': 'mymodel', 'field': 'my_field'} ]]
정확한 이름 또는 fnmatch 패턴으로 모델을 화이트리스트에 올릴 수 있습니다.
# django 구성 nplusone_whitelist = [ { 'model': 'myApp.*'} ]]
로컬로 알림을 억제하려면 컨텍스트 ignore
관리자를 사용하십시오.
NPLUSONE에서 코어 가져 오기 신호 Signals.ignore (Signals.lazy_load) : # 게으른로드 행 # ...
MIT 라이센스. 자세한 내용은 번들 라이센스 파일을 참조하십시오.