Skip to main content

quadkit-sql

SQL database abstractions for Quadkit Framework — Postgres, MySQL, SQLite with migrations, repositories, and query building.


Overview

quadkit-sql provides an async SQLAlchemy ORM layer with the repository pattern, unit-of-work, connection pooling, multi-database support, Alembic migrations, and optional HMAC audit checksums. All database operations are wired through DatabaseProviderProtocol in the DI container.


Full documentation: docs.quadkit.dev

Install

uv add quadkit quadkit-sql

# With async PostgreSQL driver
uv add "quadkit-sql[postgres]"

# With async MySQL driver
uv add "quadkit-sql[mysql]"

# With SQLite async driver
uv add "quadkit-sql[sqlite]"

Quick Start

from quadkit import Application, StandardModule
from quadkit.di.module import Module, module
from quadkit.sql import DatabaseModule
from quadkit.sql.config import DatabaseConfig


@module(
    imports=[
        DatabaseModule.configure(
            DatabaseConfig(url="postgresql+asyncpg://user:pass@localhost/mydb")
        )
    ]
)
class AppModule(Module):
    pass


async def main() -> None:
    async with Application.boot(modules=[AppModule]) as app:
        from quadkit.contracts.data.sql.database import DatabaseProviderProtocol

        db = await app.container.resolve(DatabaseProviderProtocol)
        result = await db.execute_query("SELECT 1")


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

Configuration

Zero-config usage: Call DatabaseModule.configure() with no arguments to use all defaults (SQLite).

Option 1 — YAML file

# application.yaml
sql:
  backend:
    url: "${QK_SQL__BACKEND__URL}"
  pool:
    min_size: 2
    max_size: 10
    timeout: 30
  operations:
    echo: false
export QK_SQL__BACKEND__URL=postgresql+asyncpg://user:pass@host/db
export QK_SQL__POOL__MAX_SIZE=20
export QK_SQL__POOL__TIMEOUT=60

Option 3 — Python

from quadkit.sql import DatabaseModule
from quadkit.sql.config import DatabaseConfig

DatabaseModule.configure(
    DatabaseConfig(
        url="postgresql+asyncpg://user:pass@localhost/mydb",
    )
)

Config reference

Field Default Env var Description
backend.url "sqlite:///data.db" QK_SQL__BACKEND__URL Database connection URL
pool.min_size 1 QK_SQL__POOL__MIN_SIZE Minimum pool connections
pool.max_size 10 QK_SQL__POOL__MAX_SIZE Maximum pool connections
pool.timeout 30 QK_SQL__POOL__TIMEOUT Pool acquire timeout (seconds)
operations.echo False QK_SQL__OPERATIONS__ECHO Echo SQL statements
audit_hmac_key None QK_SQL__AUDIT_HMAC_KEY HMAC key for audit checksums

Module Factory Methods

Method Description
DatabaseModule.configure(config, enable_migrations, migration_dir) Configure with explicit DatabaseConfig
DatabaseModule.scope(*repositories) Scope repository classes into a feature module
DatabaseModule.stub(config=None) In-memory SQLite for testing

Key Features

  • Repository pattern — SQLRepository base class with find, create, update, delete, count
  • Unit of work — AbstractUnitOfWork tracks changes and publishes domain events on commit
  • Multi-database — NamedDatabaseConfig for multiple backends resolved via Annotated[DatabaseProviderProtocol, Named("analytics")]
  • Connection pooling — SQLAlchemy async pool with configurable min/max size
  • Alembic migrations — optional, run on boot only when enable_migrations=True (off by default)
  • HMAC audit checksums — optional signing of write operations for integrity verification
  • Production security — blocks default passwords (:password@, :postgres@, etc.) when QK_ENV=production

Testing

from quadkit import Application
from quadkit.sql import DatabaseModule
from quadkit.sql.config import DatabaseConfig


async def test_repository():
    async with Application.boot(
        modules=[
            DatabaseModule.stub(DatabaseConfig(url="sqlite+aiosqlite:///:memory:"))
        ]
    ) as app:
        db = await app.container.resolve(DatabaseProviderProtocol)
        # run your test queries

Key Source Files

File What it contains
src/quadkit/sql/module.py DatabaseModule.configure(), .scope(), .stub()
src/quadkit/sql/config.py DatabaseConfig, DatabasePoolConfig, NamedDatabaseConfig
src/quadkit/sql/di/provider.py DatabaseProvider boot and registration
src/quadkit/sql/repositories/base.py SQLRepository base class
src/quadkit/sql/unit_of_work/base.py AbstractUnitOfWork

Metadata

Release files for quadkit-sql 0.0.45

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for quadkit-sql 0.0.45
File Size Uploaded Provenance
quadkit_sql-0.0.45.tar.gz 451.9 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for quadkit-sql 0.0.45
File Interpreter ABI Platform
quadkit_sql-0.0.45-py3-none-any.whl Python 3 none any Details

Total release size: 802.1 kB

Release files / quadkit_sql-0.0.45.tar.gz

Download URL quadkit_sql-0.0.45.tar.gz
Size 451.9 kB
Tags Source
SHA-256 checksum
How to use checksums
0529abff28eacd05436d66c45afe89156e69a5bcea8bde219c6a049b4f5ecaf1
BLAKE2b-256 checksum
How to use checksums
689422d41b72ecd92e7ed6f2595f0f8227283bea5dffc99f64697251d660bc46
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / quadkit_sql-0.0.45-py3-none-any.whl

Download URL quadkit_sql-0.0.45-py3-none-any.whl
Size 350.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
038eb3795aaacdd6062a2ccc4eeb2bb07150370aafdf4988ea26d0a4de902def
BLAKE2b-256 checksum
How to use checksums
fce138caaf0dea4a6737326f086dfc53647b7822f34daba265358e5fd1e98b64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for quadkit-sql 0.0.45

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page