Skip to main content

SQLAlchemy model N+1 debugger

Project description

QueryCounter

QueryCounter Publish PyPI version PyPI pyversions Downloads Downloads PyPI license

SQLAlchemy model N+1 debugger.

NOTE: This is a debugging tool that is not meant to be deployed in production.

About

This module will help identify N+1 DB calls made through SQLAlchemy. It takes advantage of the SQLAlchemy event listener for do_orm_execute.

QueryCounter will provide insights into which model DB calls are made multiple times, with optional tracebacks and heuristics to determine where these calls originate.

By default, QueryCounter will log results with an optional config to raise an Exception.

Installation

pip install query-counter

Usage

Usage: Create QueryCounter with a SQLalchemy session, an optional config, and initialize when you would like to start tracking requests:

from query_counter import QueryCounter

query_counter = QueryCounter(session=session)
query_counter.initialize()

Run analyze to dig into queries that ran since initialization:

query_counter.analyze()

This also works as a context manager:

with QueryCounter(
    session=session, config=QueryAnalysisConfig(alert_threshold=0)
) as counter:
    session.query(User).first()
    counter.analyze()

Setting a breakpoint in the analyze function will allow you to inspect all of the queries and their stack traces.

Configuration

QueryCounter accepts an optional config kwarg of type QueryAnalysisConfig.

QueryAnalysisConfig is a dataclass with the following specifications/defaults:

# QueryCounter analyze will not log or raise exceptions if the number
# of duplicated DB calls is less than the alert_threshold
alert_threshold: int = 10

# QueryCounter analyze will raise an exception if True
raise_if_exceeds: bool = False

# QueryCounter analyze will info log if no DB calls
# exceed the threshold
log_no_alert: bool = False

# QueryCounter will store the stacktrace relevant to the DB call
traceback_enabled: bool = False

# QueryInstance will inspect frames and filter the stack down
# to codepaths specified in heuristic_paths
heuristics_enabled: bool = False

# Requires heuristics_enabled=True - filters stack down to
# these codepaths
heuristic_paths: list = field(default_factory=list)

TODO

  • Linting
  • Tests
  • Pipeline

License

QueryCounter is distributed under the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

query-counter-0.3.1.tar.gz (6.3 kB view details)

Uploaded Source

Built Distribution

query_counter-0.3.1-py3-none-any.whl (7.5 kB view details)

Uploaded Python 3

File details

Details for the file query-counter-0.3.1.tar.gz.

File metadata

  • Download URL: query-counter-0.3.1.tar.gz
  • Upload date:
  • Size: 6.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.12

File hashes

Hashes for query-counter-0.3.1.tar.gz
Algorithm Hash digest
SHA256 7f930485d6c3d7740e6364bbe5753e547f653e8cb8c88466f8ddc5f984844556
MD5 bfbef85005522db7a3b6c27912d9acac
BLAKE2b-256 d687d0d390f09b7d1df3a3d7deba8a30d5fe137385d80ab7753c75f8b2bf7cba

See more details on using hashes here.

File details

Details for the file query_counter-0.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for query_counter-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 fa76a7ee32cf7ef212e4628c14344e4d1d13c572b1a23430b485e1e869a49e1f
MD5 0d839eb95bd19d0503f6b976625e6c0f
BLAKE2b-256 2e32b9dafc4594f4a3d6fc300532ef73383daf8108d9ea8010b081311248b563

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page