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: oridecon.dev/quadkit
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.46
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.46.tar.gz | 451.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| quadkit_sql-0.0.46-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 802.1 kB
Release files / quadkit_sql-0.0.46.tar.gz
| Download URL | quadkit_sql-0.0.46.tar.gz |
|---|---|
| Size | 451.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d1856f5832a8fa6bebe1dbf045b7e7c9d0b270426c62e1536be6e429a739da7e
|
|
BLAKE2b-256 checksum How to use checksums |
f0ea4f2c09358692f4d271da238a621e76e04e63c8daf8ae6733f458e5aaf477
|
| 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.46-py3-none-any.whl
| Download URL | quadkit_sql-0.0.46-py3-none-any.whl |
|---|---|
| Size | 350.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4708d24f8e282dbe0d0ecea472352fab0d2b190ea2f5748576eb4435c2787f67
|
|
BLAKE2b-256 checksum How to use checksums |
a24aabf9b05f0a6f5d0f3b4cba2da1619a92e811af23101fa2e8d0e4790bd6db
|
| 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.46
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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.