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
Option 2 — Profiles + Environment Variables (recommended)
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 —
SQLRepositorybase class with find, create, update, delete, count - Unit of work —
AbstractUnitOfWorktracks changes and publishes domain events on commit - Multi-database —
NamedDatabaseConfigfor multiple backends resolved viaAnnotated[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.) whenQK_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.43
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| quadkit_sql-0.0.43.tar.gz | 432.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| quadkit_sql-0.0.43-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 768.0 kB
Release files / quadkit_sql-0.0.43.tar.gz
| Download URL | quadkit_sql-0.0.43.tar.gz |
|---|---|
| Size | 432.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ee1697b33f49c2ab6b7635c2c23d169f24da197991e6019209c3f54cdb819838
|
|
BLAKE2b-256 checksum How to use checksums |
06db106e2d2c02aa9d3d41e43b99c6506a698aae91e49d489afec2a820bda1f0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.14
|
Release files / quadkit_sql-0.0.43-py3-none-any.whl
| Download URL | quadkit_sql-0.0.43-py3-none-any.whl |
|---|---|
| Size | 335.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
15ac7e16cb2b9eeb9610e49175ab73a5ce17ad8e7aafdf336d3e1ec985e3abb6
|
|
BLAKE2b-256 checksum How to use checksums |
ec9e8c26ab253e0247a74bdf05ca397f7c048b5fdc1cf4688b7986a37a3b73a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.8.14
|
Security for quadkit-sql 0.0.43
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.