Skip to main content

Lightweight query access-pattern declaration for ORMs

Project description

query-patterns

Declare query-access patterns in code and verify matching DB indexes. Supports SQLAlchemy and Django, both schema-based and database introspection modes. SQLModel is also supported, as it is built on top of SQLAlchemy.

Motivation

As projects grow, the number and variety of database queries increase. Over time, it becomes difficult to maintain a consistent set of query-access patterns across the codebase, and even harder to verify whether each pattern is backed by an appropriate database index. Relying on manual checks or memory often leads to:

  • Missing or outdated indexes that cause silent performance regressions
  • Inconsistent query patterns across teams or modules
  • Schema changes that unintentionally break previously optimized queries
  • Performance issues that surface only in production traffic

query-patterns addresses these problems by allowing you to declare expected query patterns in code and validate them against either your ORM schema or a running database instance — all via a simple CLI command.

What it does

  • Collects all @query_pattern declarations from your Python modules
  • Extracts index definitions from:
    • SQLAlchemy (including SQLModel)
      • ORM schema (MetaData)
      • Actual DB (Inspector)
    • Django
      • ORM schema (Model._meta.indexes)
      • Actual DB (connection.introspection)
  • Compares (table, columns) tuples
  • Can be integrated into CI to enforce index coverage

Install

pip install query-patterns

Declare a pattern

from query_patterns import query_pattern


# Declare query pattern using table/column names
class RepoA:
    @query_pattern(table="users", columns=["email"])
    def find(self, email): ...


# Declare query pattern using ORM models
# (works with SQLAlchemy, SQLModel, and Django models)
from models import User

class RepoB:
    @query_pattern(table=User, columns=[User.email])
    def find(self, email): ...

a. SQLAlchemy Command

# Reads declared indexes from SQLAlchemy MetaData
query-patterns sqlalchemy \
  --metadata myapp.db.metadata

# collects query patterns from the specified module
query-patterns sqlalchemy \
  --metadata myapp.db.metadata \
  --module myapp.repo
  
# Reads actual indexes from the database
query-patterns sqlalchemy \
  --source db \
  --engine-url postgresql://user:pass@localhost/mydb

b. Django Command

# Reads Model._meta.indexes from installed apps
query-patterns django \
  --settings config.settings

# collects query patterns from the specified module
query-patterns django \
  --settings config.settings \
  --module myapp.repo
  
# Reads actual DB indexes using Django introspection
query-patterns django \
  --source db \
  --settings config.settings

c. SQLModel Command

# Reads declared indexes from SQLModel MetaData
query-patterns sqlmodel \
  --metadata myapp.db.metadata

# collects query patterns from the specified module
query-patterns sqlmodel \
  --metadata myapp.db.metadata \
  --module myapp.repo
  
# Reads actual indexes from the database
query-patterns sqlmodel \
  --source db \
  --engine-url postgresql://user:pass@localhost/mydb

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_patterns-0.1.11.tar.gz (11.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

query_patterns-0.1.11-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

File details

Details for the file query_patterns-0.1.11.tar.gz.

File metadata

  • Download URL: query_patterns-0.1.11.tar.gz
  • Upload date:
  • Size: 11.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for query_patterns-0.1.11.tar.gz
Algorithm Hash digest
SHA256 024d329f493d2a72225e524658ff53d7f8d11354e19ae419ff338e0e73b8ea3c
MD5 d76db6e7cc6bf5f57d2b162f85d838fb
BLAKE2b-256 dc0610c17aa62189397e0f3b45b682fcafd5ba74db7560a9c3d664c2f1986895

See more details on using hashes here.

File details

Details for the file query_patterns-0.1.11-py3-none-any.whl.

File metadata

File hashes

Hashes for query_patterns-0.1.11-py3-none-any.whl
Algorithm Hash digest
SHA256 2b8811b9418ab4dc756b6a35e8a3f967b1144f811f78c03cc10eed082ad94d07
MD5 b0a229ee752068e5b5a2748acc2ca8f4
BLAKE2b-256 2a3a76233f4301ba17b0fb4f0583f4ba52e24db2fe71dd51d2e90a958bf1281e

See more details on using hashes here.

Supported by

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